我正在使用 Spring 构建一个简单的 AJAX/JSON Web 服务。常见的数据流是:
some DTO from browser
v
Spring @Controller method
v
Spring @Service method
我正在寻找处理数据验证的最简单方法。
- 我知道
@Valid
在方法中运行良好的注释@Controller
。 - 为什么在方法中
@Valid
不起作用@Service
?
我的意思是:任何其他服务和控制器都可以使用服务方法。@Service
那么在级别进行验证不是更有意义吗?
让我们看这个简单的例子:
MyDTO.java:
public class MyDTO {
@NotNull
public String required
@Min(18)
public int age;
}
MyServiceImpl.java:
public MyDomainObject foo(MyDTO myDTO) {
// persist myDTO
// and return created domain object
}
MyController.java:
@Autowired
MyService myService;
@Autowired // some simple bean mapper like Dozer or Orika
Mapper mapper; // for converting domain objects to DTO
@RequestMapping(...)
public MyDomainObjectDTO doSomething(@RequestBody MyDTO myDTO) {
mapper.map(myService.foo(myDTO), MyDomainObjectDTO.class);
}
服务方法接收 DTO 是常见的做法吗?
- 如果
yes
:在服务方法中验证 DTO 的最佳实践是什么? - 如果
no
:控制器是否应该操纵域对象并让服务保存该对象?(这对我来说似乎毫无用处)
在我看来,该服务应该只负责数据一致性。
你如何解决这个问题?