Ответ Spring REST отличается в пользовательском контроллере

У меня есть несколько контроллеров, которые автоматически создают REST конечные точки.

@RepositoryRestResource(collectionResourceRel = "books", path = "books")
public interface BooksRepository extends CrudRepository<Books, Integer> {
    public Page<Books> findTopByNameOrderByFilenameDesc(String name);
}

Когда я посещаю: http://localhost:8080/Books

Я вернусь:

{
    "_embedded": {
        "Books": [{
            "id": ,
            "filename": "Test123",
            "name": "test123",
            "_links": {
                "self": {
                    "href": "http://localhost:8080/books/123"
                },
                "Books": {
                    "href": "http://localhost:8080/books/123"
                }
            }
        }]
    },
    "_links": {
        "self": {
            "href": "http://localhost:8080/books"
        },
        "profile": {
            "href": "http://localhost:8080/profile/books"
        },
        "search": {
            "href": "http://localhost:8080/books/search"
        },
        "page": {
            "size": 20,
            "totalElements": 81,
            "totalPages": 5,
            "number": 0
        }
    }
}

Когда я создаю свой собственный контроллер:

@Controller
@RequestMapping(value = "/CustomBooks")
public class CustomBooksController {
    @Autowired
    public CustomBookService customBookService;

    @RequestMapping("/search")
    @ResponseBody
    public Page<Book> search(@RequestParam(value = "q", required = false) String query,
                                 @PageableDefault(page = 0, size = 20) Pageable pageable) {
        return customBookService.findAll();
    }
}

Я получу ответ, который не похож на автоматически сгенерированный ответ контроллера:

{
    "content": [{
        "filename": "Test123",
        "name" : "test123"
    }],
    "totalPages": 5,
    "totalElements": 81,
    "size": 20,
    "number": 0,
}

Что мне нужно сделать, чтобы мой ответ выглядел как автоматически сгенерированный ответ? Я хочу, чтобы он был согласованным, поэтому мне не нужно переписывать код для другого ответа. Должен ли я делать это по-другому?


Изменить: Найдено это: Включить сериализацию HAL в Spring Boot для пользовательского метода контроллера

Но я не понимаю, что мне нужно изменить в контроллере REST, чтобы включить: PersistentEntityResourceAssembler, Я искал в Google для PersistentEntityResourceAssembler, но это приводит меня к подобным страницам без особого примера (или этот пример, кажется, не работает для меня).

1 ответ

Решение

Как @chrylis предложил вам заменить @Controller аннотация с @RepositoryRestController для Spring-data-rest, чтобы вызвать его ResourceProcessors для настройки данного ресурса.

Чтобы ваш ресурс соответствовал спецификации HATEOAS (например, ваш Spring-data-rest BooksRepository), ваш тип возврата объявления метода должен быть таким: HttpEntity<PagedResources<Resource<Books>>>Для преобразования вашего объекта Page в PagedResources:

  • Вам нужно автоматически связать этот объект.

    @Autowired private PagedResourcesAssembler<Books> bookAssembler;

  • Ваше возвращение должно быть как

    return new ResponseEntity<>(bookAssembler.toResource(customBookService.findAll()), HttpStatus.OK);

Эти изменения должны помочь вам получить ответ, соответствующий org.springframework.hateoas.Resources, содержащий "_embedded" а также "_links"атрибут.

Другие вопросы по тегам