valid requestmapping puede para método mvc formulario escritura encontrar ejemplo commandname atributo spring validation spring-mvc service dto

requestmapping - ¿Validación de Spring DTO en Service o Controller?



spring mvc formulario ejemplo (2)

Estoy construyendo un servicio web sencillo de AJAX / JSON con Spring. El flujo de datos común es:

some DTO from browser v Spring @Controller method v Spring @Service method

Estoy buscando la manera más fácil de manejar la validación de datos.

  • Conozco la anotación @Valid que funciona bastante bien dentro de los métodos @Controller .
  • ¿Por qué @Valid no funciona dentro de los métodos @Service ?

Quiero decir: un método de servicio puede ser utilizado por cualquier otro servicio y controlador. Entonces, ¿no tendría mucho más sentido validar a nivel @Service ?

Tomemos este simple ejemplo:

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

¿Es una práctica común que el método de servicio reciba el DTO?

  • En caso yes ¿cuál es la mejor práctica para validar ese DTO dentro del método de servicio?
  • En caso negativo, ¿debería el controlador manipular el objeto Dominio y dejar que el servicio lo guarde? (Esto me parece bastante inútil)

En mi opinión, el servicio solo debería ser responsable de la coherencia de los datos.

¿Cómo resuelves esto?


¿Mi respuesta? Ambos.

El servicio debe verificar su propio contrato para verificar su validez.

El controlador es parte de la IU. Debe validar y vincular para una mejor experiencia del usuario, pero el servicio no debe confiar en él.

El servicio no puede saber cómo se llama. ¿Qué pasa si lo envuelve como un servicio REST?

El servicio también conoce las infracciones de la lógica de negocios de una manera que ninguna interfaz de usuario puede. Necesita validar para asegurarse de que el caso de uso se cumpla de manera adecuada.

Doble bolsa; Haz ambos.


Ver mi otra respuesta: Comprobar las condiciones previas en el controlador o la capa de servicio

Si realmente quieres hacer una validación como el manejo de errores en tu capa de servicio similar a Spring MVC puedes usar javax.validation y AspectJ (para asesorar a los métodos para validar) que es lo que hago porque me gusta hacer la reflexión hacer el trabajo y la programación declarativa (anotaciones).

Spring MVC no necesita hacer AspectJ / AOP para manejar el error porque los métodos se llaman a través de la reflexión (enrutamiento url / despacho).

Finalmente, para su código MVC, debe saber que @Valid está desaprobada de manera extraoficial. En su lugar, considere @Validated que aprovechará más funciones de javax.validation .