Bhu*_*ale 13 java rest spring-mvc dto content-negotiation
考虑使用UserDTO类和UserController公开端点来创建,更新和获取用户.
在UserDTO类中具有id属性对于创建和更新没有意义.如果我使用swagger或其他自动生成的API文档,那么它会显示id可以在create end point中传递.但系统不使用它,因为ID是在内部生成的.
如果我看看get那么可能我可以摆脱id属性,但它肯定是在列表用户端点.
我想在get/list端点返回内部用户域对象.这样我就可以从UserDTO类中删除id属性.
我可以为此采用更好的选择吗?
public class UserDTO {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
@RestController
@RequestMapping(value = "/users", produces = MediaType.APPLICATION_JSON_VALUE)
public class UserController {
@RequestMapping(method = RequestMethod.POST)
@ResponseBody
public ResponseEntity<Void> create(@RequestBody UserDTO user) {
}
@RequestMapping(value = "{id}", method = RequestMethod.GET)
@ResponseBody
public ResponseEntity<UserDTO> get(@PathVariable("id") int id) {
}
@RequestMapping(value = "{id}", method = RequestMethod.PUT)
@ResponseBody
public ResponseEntity<Void> update(@PathVariable("id") int id, @RequestBody UserDTO user) {
}
}
Run Code Online (Sandbox Code Playgroud)
可能有人问过这个问题,但我找不到.请原谅我重复的问题.
D ata T ransfer O bject(DTO)是一种用非常明确的目的创建的模式:将数据传输到远程接口,就像 Web服务一样.这种模式非常适合REST API,从长远来看,DTO将为您提供更大的灵活性.
一旦REST资源表示不需要与持久性对象具有相同的属性,我建议为端点使用定制的类.
为避免样板代码,您可以使用映射框架(如MapStruct)将REST API DTO映射到/到持久性对象.
有关在REST API中使用DTO的好处的详细信息,请检查以下答案:
要为您的DTO提供更好的名称,请检查以下答案:
小智 2
创建两个不同的接口怎么样:
interface UserDTO {
public String getName ();
public void setName (String name);
}
interface IdentifiableUserDTO extends UserDTO {
public Long getId ();
public void setId (Long id);
}
class DefaultUserDTO implements IdentifiableUserDTO {
}
Run Code Online (Sandbox Code Playgroud)
然后在控制器中使用 Interface 而不是 DTO 类:
@RestController
@RequestMapping(value = "/users", produces = MediaType.APPLICATION_JSON_VALUE)
public class UserController {
@RequestMapping(method = RequestMethod.POST)
@ResponseBody
public ResponseEntity<Void> create(@RequestBody IdentifiableUserDTO user) {
}
@RequestMapping(value = "{id}", method = RequestMethod.GET)
@ResponseBody
public ResponseEntity<UserDTO> get(@PathVariable("id") int id) {
}
@RequestMapping(value = "{id}", method = RequestMethod.PUT)
@ResponseBody
public ResponseEntity<Void> update(@PathVariable("id") int id, @RequestBody UserDTO user) {
}
}
Run Code Online (Sandbox Code Playgroud)