我正在使用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”属性或将其替换为“内容”之类的内容?
我尝试在我的application.yml上添加此属性:
弹簧: HATEOAS: use-hal-as-default-json-media-type:false
我也试过没有“ - ”:
useHalAsDefaultJsonMediaType:false
没有运气。我还尝试在请求中添加以下标头值,但它无法正常工作:
“Accept: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
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));
}
}
目前该怎么办真的很无能为力。 提前谢谢。
答案 0 :(得分:0)
免责声明:我还没有与Spring HATEOAS合作过。
我将假设您使用的是Spring 4.1或更高版本,并在休息控制器中使用@RequestMapping
方法返回一个对象。
要修改响应,您可以实现在将响应写回客户端之前调用的ResponseBodyAdvice
接口。 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;
}
}
如果我打电话,则会打印网址{"content":"edited content"}
。也许您可以使用它来按照您想要的方式编辑响应?
对于将来的问题,如果您包含更多信息,例如所使用的框架版本或相关代码(在本例中为RestController),将会很有帮助。