Java Jersey:如何使用自定义的“ExceptionApperFactory”`

Java Jersey:如何使用自定义的“ExceptionApperFactory”`,java,jersey,jersey-2.0,Java,Jersey,Jersey 2.0,我需要使用自定义的异常外观工厂来实现自定义的查找()逻辑 public class MyExceptionMapperFactory extends ExceptionMapperFactory { // [...] @Override public <T extends Throwable> ExceptionMapper<T> find(Class<T> type) { // [...] } } 有什

我需要使用自定义的
异常外观工厂
来实现自定义的
查找()
逻辑

public class MyExceptionMapperFactory extends ExceptionMapperFactory {

    // [...]

    @Override
    public <T extends Throwable> ExceptionMapper<T> find(Class<T> type) {
         // [...]
    }
}

有什么想法吗?蒂亚

我从未实现过这一点,所以我不知道所有的细微差别,但简单地看一下和,看起来您只需要

不确定如何禁用原始版本,但如果它仍在使用,您可以尝试为您的工厂禁用,以便在查找时,您的版本将优先

bindAsContract(MyExceptionMapperFactory.class)
        .to(ExceptionMappers.class)
        .ranked(Integer.MAX_VALUE)
        .in(Singleton.class);

更新 由于排名不起作用,下面的内容似乎会删除原来的工厂

@Provider
public class ExceptionMapperFactoryFeature implements Feature {

    @Override
    public boolean configure(FeatureContext context) {
        final ServiceLocator locator = ServiceLocatorProvider.getServiceLocator(context);
        final Descriptor<?> descriptor = locator.getBestDescriptor(new Filter() {
            @Override
            public boolean matches(Descriptor d) {
                return d.getImplementation().equals(ExceptionMapperFactory.class.getName());
            } 
        });
        ServiceLocatorUtilities.removeOneDescriptor(locator, descriptor);

        context.register(new AbstractBinder() {
            @Override
            public void configure() {
                bindAsContract(MyExceptionMapperFactory.class)
                        .to(ExceptionMappers.class)
                        .in(Singleton.class);
            }
        });
        return true;
    }
}
@Provider
公共类例外ApperFactoryFeature实现该功能{
@凌驾
公共布尔配置(FeatureContext上下文){
最终ServiceLocator定位器=ServiceLocatorProvider.getServiceLocator(上下文);
最终描述符描述符=locator.getBestDescriptor(新过滤器(){
@凌驾
公共布尔匹配(描述符d){
返回d.getImplementation().equals(exceptionApperFactory.class.getName());
} 
});
ServiceLocatorUtilities.removeOneDescriptor(定位器,描述符);
register(新的AbstractBinder(){
@凌驾
public void configure(){
bindAsContract(MyExceptionMapperFactory.class)
.to(例外Appers.class)
.在(独生子女班);
}
});
返回true;
}
}

谢谢。不幸的是,它不起作用。即使我将秩设置为
Integer.MAX\u VALUE
,新值也会被完全忽略。是否尝试使用最小值?也许我弄错了。如果这不起作用,我以后可能需要对它进行测试,它与Integer.MIN_值相同。它仍然被忽略。请尝试删除它。可能会有错误。我懒得打开IDE。您需要注册该功能。如果有什么用,请告诉我。
bindAsContract(MyExceptionMapperFactory.class)
        .to(ExceptionMappers.class)
        .ranked(Integer.MAX_VALUE)
        .in(Singleton.class);
@Provider
public class ExceptionMapperFactoryFeature implements Feature {

    @Override
    public boolean configure(FeatureContext context) {
        final ServiceLocator locator = ServiceLocatorProvider.getServiceLocator(context);
        final Descriptor<?> descriptor = locator.getBestDescriptor(new Filter() {
            @Override
            public boolean matches(Descriptor d) {
                return d.getImplementation().equals(ExceptionMapperFactory.class.getName());
            } 
        });
        ServiceLocatorUtilities.removeOneDescriptor(locator, descriptor);

        context.register(new AbstractBinder() {
            @Override
            public void configure() {
                bindAsContract(MyExceptionMapperFactory.class)
                        .to(ExceptionMappers.class)
                        .in(Singleton.class);
            }
        });
        return true;
    }
}