2012-04-30 14 views
6

Tengo una clase de bean con múltiples restricciones internas (personalizadas) y una restricción de nivel de clase. Me gustaría validar las restricciones internas antes de la restricción de nivel de clase. El código es el siguiente:Validación de Java Bean: GroupSequence con restricción de nivel de clase

@GroupSequence({ Inner.class, NewSlotBean.class }) 
@TotalBeanValid(groups = NewSlotBean.class) 
public class NewSlotBean { 

    @DayMonthYearString(groups = Inner.class) 
    private String slotDay; 

    @TimeString(groups = Inner.class) 
    private String slotBegin; 

    @LengthString(groups = Inner.class) 
    private String slotLength; 
} 

(Inner es sólo una interfaz vacía ahí en alguna parte).

Sin embargo, cuando intento ejecutar esto, la restricción de nivel de clase no se valida en absoluto. Cuando trato de definir el GroupSequence como

@GroupSequence({ Inner.class, Outer.class }) 

(con Outer ser una interfaz de azar), consigo la excepción:

javax.validation.GroupDefinitionException: ...*.beans.NewSlotBean must be part of the redefined default group sequence. 

¿Tiene s/o conocer cómo asegurarse de que el nivel de clase la restricción se valida después de las internas? (!. Este no parece ser el valor por defecto que he tenido problemas con él al azar a aparecer después de un tiempo)

Respuesta

10

Prueba esto:

@GroupSequence({ Inner.class, NewSlotBean.class }) 
@TotalBeanValid(groups = Default.class) 
public class NewSlotBean { 

    @DayMonthYearString(groups = Inner.class) 
    private String slotDay; 

    @TimeString(groups = Inner.class) 
    private String slotBegin; 

    @LengthString(groups = Inner.class) 
    private String slotLength; 
} 

De acuerdo con la especificación NewSlotBean es sólo un stand- para el grupo predeterminado. Véase también la sección 3.4.3 de la especificación Bean Validation:

Como las secuencias no pueden tener dependencias circulares, utilizando por defecto en la declaración de una secuencia no es una opción. Restricciones alojados en una clase A y que pertenece al grupo predeterminado (por defecto o explícitamente) implícitamente pertenecen al grupo A.

una secuencia definida en una clase A (es decir, la redefinición de los grupos predeterminados para la clase) debe contiene el grupo A. En otras palabras, las restricciones predeterminadas alojadas en una clase deben ser parte de la definición de secuencia. Si una @GroupSequence que redefine el grupo Predeterminado para una clase A does does no contiene el grupo A, se genera una GroupDefinitionException cuando Proceso de validación y declaración de constricción la clase se valida o cuando se solicitan sus metadatos.

+0

Sólo una sugerencia de mejora a una excelente respuesta: es probablemente mejor para agrupar las validaciones al revés: '@GroupSequence ({NewSlotBean.class, ClassLevel.class}) @TotalBeanValid (grupos) = ClassLevel.class 'en la clase' NewSlotBean' y luego eliminar el grupo de validación 'InnerGroup' y las asignaciones de grupo de nivel de campo - las validaciones de campo se asignan automáticamente al grupo de validación predeterminado. Menos código, más limpio. – jannis

Cuestiones relacionadas