如何避免Spring Boot中的重复端点来支持Hateoas?

时间:2015-09-16 03:57:47

标签: java spring-boot spring-hateoas

我后来一直在实施Spring Hateoas,但我发现我到处都在使用样板代码来支持这两种格式:application/jsonapplication/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);
}

有一点需要注意的是,UserResourceDTOUserDTO不能是同一个对象,因为第一个是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开箱即用的东西可以达到此目的?

0 个答案:

没有答案