首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Spring RepositoryRestResource中删除"_embedded“属性

在Spring RepositoryRestResource中删除"_embedded“属性
EN

Stack Overflow用户
提问于 2018-06-01 23:02:58
回答 1查看 1.6K关注 0票数 4

我正在使用Spring Boot2.0.2(带有oAuth2 2.3.3)和HATEOAS (我有一个依赖文件表明我正在使用它,尽管我的关注点不是它)来构建一个RestAPI。我可以提出请求并获得响应。然而,当我请求一个集合/页面时,我在一个"_embedded“对象中得到了响应,如下所示:

代码语言:javascript
复制
{
  "_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

我也试过不使用"-":

useHalAsDefaultJsonMediaType: false

不走运。我还尝试在请求上添加以下头值,但它不能正常工作:

"Accept: application/hal+json“给出相同的响应,或者"Accept: application/x-spring-data-verbose+json”给出406不可接受。

这是我的资源:

代码语言:javascript
复制
@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);


}

我还有一个控制器,用于在无会话上下文中公开当前用户。我不想再谈这个了:

代码语言:javascript
复制
@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));
    }

}

我真的不知道现在该做什么。提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2018-06-02 00:21:09

免责声明:我还没有使用Spring HATEOAS。

我假设您使用的是Spring4.1或更高版本,并且在rest控制器中返回一个带有@RequestMapping方法的对象。

要修改响应,您可以实现在将响应写回客户端之前调用的ResponseBodyAdvice接口。在本例中,MyResponse类包含我想要修改的内容。它只有一个名为String的内容属性。

如果我的@RequestMapping方法看起来像这样:

代码语言:javascript
复制
@RequestMapping("/q50646303")
  public MyResponse q50646303() {
    MyResponse myResponse = new MyResponse();
    myResponse.setContent("content");
    return myResponse;
  }

我可以像这样更改响应的内容:

代码语言:javascript
复制
@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 ),这将是有帮助的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50646303

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档