在Restful Web服务中正确使用DTO

时间:2019-05-28 09:38:54

标签: java spring rest oop

我正在使用spring框架开发一个宁静的Web服务。我对如何在项目中正确使用DTO有一些疑问。

首先,我看到了许多有关使用DTO的代码示例,并且始终存在与实体的一对一映射。对于User实体,我们有UserDto,对于Country,我们有CountryDto等。我认为这一点都不灵活。对于每项服务,我都需要两个DTO进行输入和输出。可以吗?

如果为每个服务定义两个DTO,是否可以用请求和响应后缀来命名它们?例如,对于createUser服务,我有两个名为CreateUserRequestCreateUserResponse的DTO对象。

某些服务没有输出(仅是状态码)或输入(仅是URL中的ID)。我应该为他们定义一个空的DTO吗?如果我在这些情况下没有定义DTO,那会有些混乱,因为有时您为服务定义了两个DTO,有时只是一个。

我也应该将路径变量如/users/{id}映射到DTO对象吗?例如,代替:

@GetMapping("/users/{id}")
public ResponseEntity getUser(@PathVariable(value = "id") Long id)

做类似的事情:

@GetMapping("/users/{id}")
public ResponseEntity getUser(@PathVariable(value = "id") GetUserRequest request)

2 个答案:

答案 0 :(得分:0)

遵循此模式:

@RequestMapping(value = "/{id}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<User> getUser(@PathVariable long id) {
        ResponseEntity<User> response = null;
        try {
            User user = userService.getUser(id);
            response = new ResponseEntity<User>(user, HttpStatus.OK);
        } catch (ApplicationException ex) {
            response = new ResponseEntity<User>(HttpStatus.NOT_FOUND);
        }
        return response;
    }

请勿创建这样的网址:/users/{id}

创建一个像这样的网址-/{id}-这将提供更多抽象。

答案 1 :(得分:0)

在理想的静态Web服务中,您使用属性而不是请求-响应结构来操作资源。因此,如果您创建User,则可以接受并返回相同的DTO,并且方法如下所示:

@PostMapping("/")
public ResponseEntity<User> addUser(@RequestBody User user)

使用GET请求主体在技术上是可行的,但实际上已弃用,请使用路径变量和请求参数。

  

某些服务没有输出(仅是状态码)或输入(仅是URL中的ID)。我应该为他们定义一个空的DTO吗?

否,您不应为没有的对象定义DTO。

最后一个细节:如果您有多种方法来操纵相同的资源(例如,用户),请不要为获取,发布等创建多个用户DTO。