Java – use generics in parameters of exceptions

I'm trying to store a collection of generic objects in exceptions and have trouble figuring out generics Specifically, I am using hibernate validator and want to save the collected violation list in the exception for processing in another layer of application Here is an example:

Set<ConstraintViolation<User>> violations = validator.validate(user);
if (violations.size() > 0) {
    throw new ValidationException("User details are invalid",violations);
}

In eclipse, the throws line shows that the constructor is undefined and suggests that I change the constructor signature to validationexception (string, set & constraintviolation < user > > > here is 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;
    }
}

However, I want to keep the validationexception generic so that I can use it more than just user authentication I tried set < < constraintviolation > and get the same result

Is there any way to accomplish what I want to do?

Solution

You need to declare the violation setting parameter as set

public ValidationException(String msg,Set<? extends ConstraintViolation<?>> violations) {
  super(msg);
  this.violations = Collections.unmodifiableSet(
      new HashSet<ConstraintViolation<?>>(violations));
}

Then everything should work as expected

This has the additional benefit of defensive replication, ensuring that the inner set of exceptions cannot be changed

The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
分享
二维码
< <上一篇
下一篇>>