Estoy tratando de almacenar una colección de objetos genéricos dentro de un Exception
y estoy teniendo problemas para encontrar los genéricos. Específicamente, estoy usando Hibernate Validator y me gustaría guardar la lista recopilada de violaciones dentro de una excepción para el procesamiento en otra capa de la aplicación. He aquí un ejemplo:Uso de genéricos en argumentos de una excepción
Set<ConstraintViolation<User>> violations = validator.validate(user);
if (violations.size() > 0) {
throw new ValidationException("User details are invalid", violations);
}
En Eclipse, la línea throws
está mostrando el constructor definido y está sugiriendo que cambie la firma constructora para ValidationException(String, Set<ConstraintViolation<User>>
. Aquí está ValidationException:
public class ValidationException extends Exception {
private Set<ConstraintViolation<?>> violations;
public ValidationException() {
}
public ValidationException(String msg) {
super(msg);
}
public ValidationException(String msg, Throwable cause) {
super(msg, cause);
}
public ValidationException(String msg, Set<ConstraintViolation<?>> violations) {
super(msg);
this.violations = violations;
}
public Set<ConstraintViolation<?>> getViolations() {
return violations;
}
}
Sin embargo, quiero seguir ValidationException
genérico para que pueda usarlo para algo más que User
validaciones. He intentado Set<ConstraintViolation<? extends Object>>
también, pero obtengo los mismos resultados.
¿Hay alguna manera de lograr lo que estoy tratando de hacer?
¿Por qué necesita el ConstrainsViolation a ser genérica en el primer lugar? ¿No puedes simplemente crear una clase separada heredando una AbstractBase para cada posible violación? – Falcon
Pensé que el uso de un tipo de Excepción genérico sería una buena idea, pero como se menciona en @axtavt, las Excepciones no pueden ser genéricas. Consulte estas preguntas frecuentes: http://www.angelikalanger.com/GenericsFAQ/FAQSections/TechnicalDetails.html#FAQ301 – Tauren
@Falcon: 'ConstraintsViolation' es parte del paquete de validación de Hibernate y utiliza genéricos. No es una clase propia. – Tauren