gpt4 book ai didi

java - 删除 Spring RepositoryRestResource 中的 "_embedded"属性

转载 作者:行者123 更新时间:2023-12-02 04:22:21 26 4
gpt4 key购买 nike

我正在使用 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 : 仇恨: use-hal-as-default-json-media-type: false

我也尝试过不加“-”:

useHalAsDefaultJsonMediaType:假

运气不好。我还尝试在请求中添加以下 header 值,但它无法正常工作:

“接受:application/hal+json”给出相同的响应或者“接受:application/x-spring-data-verbose+json”给我一个 406 Not Acceptable 错误。

这是我的资源:

@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 ,用于在无 session 上下文中公开当前用户。我不想触及这个:

@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));
}

}

现在真的不知道该怎么办。提前致谢。

最佳答案

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

<小时/>

我假设您使用的是 Spring 4.1 或更高版本,并且您在其余 Controller 中使用 @RequestMapping 方法返回一个对象。

要修改响应,您可以实现 ResponseBodyAdvice 接口(interface),该接口(interface)在响应写回客户端之前调用。 MyResponse 类保存了我在本示例中要修改的内容。它有一个名为 content 的 String 属性。

如果我的 @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),将会很有帮助。

关于java - 删除 Spring RepositoryRestResource 中的 "_embedded"属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50646303/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com