我使用javax验证构建了一个Wildfly应用程序来验证传入的模型。 现在我正在尝试编写一个捕获任何ValidationException的异常映射器。
@Provider
public class MyValidationMapper implements ExceptionMapper<ValidationException> {
@Override
public Response toResponse(ValidationException exception) {
if (exception instanceof ResteasyViolationException) {
// do something specific
}
if (exception instanceof ConstraintViolationException) {
// do something specific
}
// do something generic
}
}
正如您所见,我希望对ResteasyViolationException
和ConstraintViolationException
进行特殊处理,这两者都是ValidationException
的直接子类。
问题是exception
是这两种的实例。
System.out.println(exception instanceof ResteasyViolationException);
System.out.println(exception instanceof ConstraintViolationException);
每次产生true
。
因此,我的映射器的行为取决于我检查异常类型的顺序。
怎么可能?显然,我对instanceof
的理解存在一些差距。或者Resteasy有什么特别之处吗?
答案 0 :(得分:4)
根据javadoc,org.jboss.resteasy.api.validation.ResteasyViolationException
扩展javax.validation.ConstraintViolationException
,因此在处理后者时,您也将始终处理前者。
选项是不使用instanceof
,但请与getClass()
核实实际类型。但请注意任何类加载器相关的怪异。
答案 1 :(得分:1)
潜在的问题是你从你的观察中得出了错误的结论。
你的观察告诉你:这两个例外不能“脱节”。 因此,最有意义的回应是质疑你自己的假设这两个是不相交的;例如通过研究javadocs。哪个会告诉你Kayamann在答案中告诉你的内容:这两个类实际上是彼此相关的。
含义:不要假设一种语言在20多年内进行单一继承......突然间“破坏”了,只是因为你遇到了似乎与这个概念相矛盾的东西。
换句话说:当现实与你的期望相矛盾时,总是首先问问自己“为什么我认为这个或那个必须是那样的”。