我后来一直在实施Spring Hateoas,但我发现我到处都在使用样板代码来支持这两种格式:application/json
和application/hal+json
。例如:
@RequestMapping(value = "/users/{userId}", method = GET, produces = {application/hal+json})
public ResponseEntity<UserResourceDTO> getUser(@PathVariable("userId")String userId) {
User user = this.userService.getUser(userId);
UserResourceDTO userResourceDTO = this.mapper.map(user, UserResourceDTO.class);
linkTo(methodOn(UserController.class).getUser(userId)).withSelfRel();
linkTo(methodOn(UserAuthorityController.class).getUserAuthorities(userId)).withRel("authorities");
return new ResponseEntity<UserResourceDTO>(userResourceDTO, HttpStatus.OK);
}
@RequestMapping(value = "/users/{userId}", method = GET, produces = {application/json})
public ResponseEntity<UserDTO> getUser(@PathVariable("userId")String userId) {
User user = this.userService.getUser(userId);
UserDTO userDTO = this.mapper.map(user, UserDTO.class);
return new ResponseEntity<UserDTO>(userDTO, HttpStatus.OK);
}
有一点需要注意的是,UserResourceDTO
和UserDTO
不能是同一个对象,因为第一个是Resource
并且没有ID,不像第二个也没有不支持不作为资源的链接。
这只是一个简短的例子,但想象一下支持Content-Types
的重复代码的数量。我知道如果我使用默认的Spring Data Rest控制器,那么我不会有这个样板代码问题,但我想用自定义代码执行此操作。
无论如何,我基本上希望有一个独特的UserDTO
注释关系,并且还有ID,类似
@Relation(value = "some link reference", rel = "authorities")
@Relation(value = "some link reference", rel = "self")
public class UserResponseDTO {
private String id;
private String username;
private String email;
// Getters and setters
}
这样,如果用户发送标题“Accept:application / json”,我将返回带有ID的json响应,如果它发送标题“Accept:application / hal + json”,那么我使用注释来构建关系(可能使用自定义MessageConverter ?)
我已经看到过使用RelProvider来加载@Relation
(上面示例中使用的不同)注释,这可能是我正在寻找但我无法做到的工作(也许是因为我没有找到相关的例子)
我可能要求的是什么?是否有Spring
开箱即用的东西可以达到此目的?