在创建,更新和获取休息终点时相同/不同的DTO对象?

时间:2016-01-25 11:01:07

标签: 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) {
    }
}

这个问题可能已被提出,但我找不到。所以请原谅我重复的问题。

2 个答案:

答案 0 :(得分:6)

Data Transfer Object(DTO)是一种用非常明确的目的创建的模式:将数据传输到远程接口,就像 web services 一样。这种模式非常适合REST API,从长远来看,DTO将为您提供更多的灵活性

一旦REST资源表示不需要与持久性对象具有相同的属性,我建议为端点使用定制的类。

为了避免使用样板代码,您可以使用映射框架(例如MapStruct)将REST API DTO映射到/来自持久性对象。

有关在REST API中使用DTO的好处的详细信息,请查看以下答案:

要为您的DTO提供更好的名称,请查看以下答案:

答案 1 :(得分:1)

关于创建两个不同界面的内容:

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 {

}

然后在控制器中使用接口而不是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) {
    }
}