Printemps DTO de validation dans le Service ou le Contrôleur?

Je suis en train de construire un simple AJAX /JSON web service avec le Printemps. La commune de flux de données est:

  some DTO from browser

            v

Spring @Controller method

            v

  Spring @Service method

Je suis à la recherche de la plus simple façon de gérer la validation des données.

  • Je sais que le @Valid annotation qui fonctionne plutôt bien à l'intérieur de @Controller méthodes.
  • Pourquoi ne @Valid pas de travail au sein de @Service méthodes?

Je veux dire: Une méthode de service peut être utilisé par un autre service et de contrôleur. Donc ne serait-il pas beaucoup plus de sens à valider au @Service niveau?


Prenons cet exemple simple:

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);
}

Il est de pratique courante que la méthode de service reçoit les DTO?

  • Si yes: Quelle est la meilleure pratique pour valider que les DTO à l'intérieur de la méthode de service?
  • Si no: peut-être Devrais-le contrôleur de manipuler l'objet du Domaine et de laisser le service de sauver cet objet? (cela semble assez inutile pour moi)

À mon avis, le service ne devrait être responsable que de la cohérence des données.

Comment voulez-vous résoudre ce problème?

OriginalL'auteur Benjamin M | 2013-09-30