对象是两个不相交的类的实例

时间:2016-08-10 09:34:29

标签: java java-ee jboss wildfly

我使用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
    }
}

正如您所见,我希望对ResteasyViolationExceptionConstraintViolationException进行特殊处理,这两者都是ValidationException的直接子类。

问题是exception这两种的实例。

System.out.println(exception instanceof ResteasyViolationException);
System.out.println(exception instanceof ConstraintViolationException);

每次产生true。 因此,我的映射器的行为取决于我检查异常类型的顺序。

怎么可能?显然,我对instanceof的理解存在一些差距。或者Resteasy有什么特别之处吗?

2 个答案:

答案 0 :(得分:4)

根据javadocorg.jboss.resteasy.api.validation.ResteasyViolationException扩展javax.validation.ConstraintViolationException,因此在处理后者时,您也将始终处理前者。

选项是不使用instanceof,但请与getClass()核实实际类型。但请注意任何类加载器相关的怪异。

答案 1 :(得分:1)

潜在的问题是你从你的观察中得出了错误的结论。

你的观察告诉你:这两个例外不能“脱节”。 因此,最有意义的回应是质疑你自己的假设这两个是不相交的;例如通过研究javadocs。哪个会告诉你Kayamann在答案中告诉你的内容:这两个类实际上是彼此相关的。

含义:不要假设一种语言在20多年内进行单一继承......突然间“破坏”了,只是因为你遇到了似乎与这个概念相矛盾的东西。

换句话说:当现实与你的期望相矛盾时,总是首先问问自己“为什么我认为这个或那个必须是那样的”。

相关问题