Sto costruendo un semplice servizio web AJAX/JSON con Spring. Il flusso di dati comune è:Convalida DTO di primavera in servizio o controller?
some DTO from browser
v
Spring @Controller method
v
Spring @Service method
sto cercando il modo più semplice per gestire la convalida dei dati.
- Conosco l'annotazione
@Valid
che funziona piuttosto bene nei metodi@Controller
. - Perché il
@Valid
non funziona con i metodi@Service
?
Intendo: un metodo di servizio può essere utilizzato da qualsiasi altro servizio e controller. Quindi non avrebbe molto più senso convalidare a livello @Service
?
Prendiamo questo semplice esempio:
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);
}
È prassi comune che il metodo di servizio riceva il DTO?
- Se
yes
: qual è la procedura migliore per convalidare tale DTO all'interno del metodo di servizio? - Se
no
: Forse il controller può manipolare l'oggetto Dominio e lasciare che il servizio salvi quell'oggetto? (questo mi sembra abbastanza inutile)
A mio parere il servizio dovrebbe essere responsabile della sola coerenza dei dati.
Come si risolve?
possibile duplicato di [Verifica precondizioni nel livello Controller o Servizio] (http://stackoverflow.com/questions/11929781/check-preconditions-in-controller-or-service-layer) –