Удаление свойства «_embedded» в Spring RepositoryRestResource - PullRequest
0 голосов
/ 01 июня 2018

Я использую Spring Boot 2.0.2 (с oAuth2 2.3.3) и HATEOAS (у меня есть файл зависимостей, который говорит, что я использую его, даже если я не фокусируюсь) для создания RestAPI.У меня нет проблем с запросами и получением ответов.Однако когда я запрашиваю коллекцию / страницу, я получаю ответ внутри объекта «_embedded», например:

{
  "_embedded" : {
    "users" : [ {
      "firstName" : "Stuff",
      "lastName" : "ToDo",
      ...
    }, {
      "firstName" : "Things1",
      "lastName" : "Does",
      ...
  } ],
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/user{?page,size,sort}",
      "templated" : true
    },
    "profile" : {
      "href" : "http://localhost:8080/profile/user"
    },
    "search" : {
      "href" : "http://localhost:8080/user/search"
    }
  },
  "page" : {
    "size" : 20,
    "totalElements" : 2,
    "totalPages" : 1,
    "number" : 0
  }
}

Можно ли удалить свойство «_embedded» или заменить его чем-то вроде «content»?

Я пытался добавить это свойство в моем application.yml:

spring: hateoas: use-hal-as-default-json-media-type: false

Iтакже пытался без "-":

useHalAsDefaultJsonMediaType: false

Не повезло.Я также попытался добавить следующие значения заголовка в запрос, но он не работает должным образом:

«Accept: application / hal + json» дает такой же ответ или «Accept: application / x-spring-data-verbose»+ json "дает мне 406 неприемлемо.

Вот мой ресурс:

@RepositoryRestResource(collectionResourceRel = "user", path = "user")
@PreAuthorize("hasRole('ROLE_ADMIN'")
public interface UserRepositoryAndResource extends PagingAndSortingRepository<User, Long> {

    public User findByLogin(@Param("login") String login);

    public Page<User> findByLoginContaining(@Param("login") String login, Pageable pageable);


}

У меня также есть контроллер, который используется для представления текущего пользователя в бессессионном контексте.Я бы предпочел не касаться этого:

@Controller
public class UserForTokenController {

    private UserRepositoryAndResource repo;

    @Autowired
    public UserForTokenController(
            UserRepositoryAndResource repo) {
        this.repo = repo;
    }

    @GetMapping("user/current")
    public ResponseEntity<UserModel> getForToken(OAuth2Authentication auth) throws UserNotFoundException {
        String authUser = (String) auth.getPrincipal();
        String login = authUser;
        User user = Optional.of(repo.findByLogin(login)).orElseThrow(() -> new UserNotFoundException());
        return ResponseEntity.ok(UserModel.build(user));
    }

}

Действительно не знаю, что делать в данный момент.Заранее спасибо.

1 Ответ

0 голосов
/ 01 июня 2018

Отказ от ответственности: я еще не работал с Spring HATEOAS.


Я собираюсь предположить, что вы используете Spring версии 4.1 или более поздней, и вы возвращаете объект с помощью метода @RequestMapping вваш контроллер покоя.

Чтобы изменить ответ, вы можете реализовать интерфейс ResponseBodyAdvice, который вызывается до того, как ответ будет записан обратно клиенту.Класс MyResponse содержит содержимое, которое я хочу изменить в этом примере.У него есть одно String свойство с именем content.

Если мой метод @RequestMapping выглядит следующим образом:

@RequestMapping("/q50646303")
  public MyResponse q50646303() {
    MyResponse myResponse = new MyResponse();
    myResponse.setContent("content");
    return myResponse;
  }

Я могу изменить содержимое ответа следующим образом:

@RestControllerAdvice
public class MyResponseBodyAdvice implements ResponseBodyAdvice<MyResponse> {

  @Override
  public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
    return MyResponse.class == methodParameter.getParameterType();
  }

  @Override
  public MyResponse beforeBodyWrite(MyResponse myResponse, MethodParameter methodParameter, MediaType mediaType,
      Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest,
      ServerHttpResponse serverHttpResponse) {
    //Change your content here
    myResponse.setContent("edited content");
    return myResponse;
  }
}

Если я позвоню, будет напечатан URL {"content":"edited content"}.Может быть, вы можете использовать это, чтобы отредактировать ответ так, как вы хотите?

Для будущих вопросов было бы полезно, если бы вы включили немного больше информации, такой как версии используемых платформ или соответствующий код (вашего RestController,в данном случае).

...