Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在实现exceptionmapper的jersey中以编程方式注册提供程序_Java_Web Services_Rest_Jersey - Fatal编程技术网

Java 在实现exceptionmapper的jersey中以编程方式注册提供程序

Java 在实现exceptionmapper的jersey中以编程方式注册提供程序,java,web-services,rest,jersey,Java,Web Services,Rest,Jersey,我如何在jersey中以编程方式注册我的提供者,它实现了jersey API提供的Exceptionmapper?我不想使用@Provider注释,而是想使用ResourceConfig注册提供程序,我该怎么做 例如: public class MyProvider implements ExceptionMapper<WebApplicationException> extends ResourceConfig { public MyProvider() {

我如何在jersey中以编程方式注册我的提供者,它实现了jersey API提供的Exceptionmapper?我不想使用@Provider注释,而是想使用ResourceConfig注册提供程序,我该怎么做

例如:

public class MyProvider implements ExceptionMapper<WebApplicationException> extends ResourceConfig {

     public MyProvider() {
        final Resource.Builder resourceBuilder = Resource.builder();
        resourceBuilder.path("helloworld");

        final ResourceMethod.Builder methodBuilder = resourceBuilder.addMethod("GET");
        methodBuilder.produces(MediaType.TEXT_PLAIN_TYPE)
                .handledBy(new Inflector<ContainerRequestContext, String>() {

            @Override
            public String apply(ContainerRequestContext containerRequestContext) {
                return "Hello World!";
            }
        });

        final Resource resource = resourceBuilder.build();
        registerResources(resource);
    }

    @Override
    public Response toResponse(WebApplicationException ex) {
        String trace = Exceptions.getStackTraceAsString(ex);
        return Response.status(500).entity(trace).type("text/plain").build();
    }
}
公共类MyProvider实现ExceptionMapper扩展ResourceConfig{
公共MyProvider(){
final Resource.Builder resourceBuilder=Resource.Builder();
resourceBuilder.path(“helloworld”);
最终ResourceMethod.Builder methodBuilder=resourceBuilder.addMethod(“GET”);
methodBuilder.Products(MediaType.TEXT\u PLAIN\u类型)
.handledBy(新拐点(){
@凌驾
公共字符串应用(ContainerRequestContext ContainerRequestContext){
返回“你好,世界!”;
}
});
最终资源=resourceBuilder.build();
注册资源(资源);
}
@凌驾
公众响应(WebApplicationException例外){
String trace=Exceptions.getStackTraceAsString(ex);
返回Response.status(500).entity(trace).type(“text/plain”).build();
}
}

这是正确的方法吗?

我猜您没有
资源配置,因为您似乎不知道如何使用它。首先,它不是必需的。如果您确实使用它,它应该是它自己的独立类。您可以在那里注册映射器

public class AppConfig extends ResourceConfig {
    public AppConfig() {
        register(new MyProvider());
    }
}
但您可能正在使用web.xml。在这种情况下,您可以使用以下


我的申请
org.glassfish.jersey.servlet.ServletContainer
jersey.config.server.provider.classnames
org.foo.providers.MyProvider

有关不同部署模型的更多信息,请参阅。部署应用程序有几种不同的方法。您甚至可以混合搭配(web.xml和ResourceConfig)。

虽然@paul samsotha的答案是正确的,但仍然有实现技巧。我想分享它,希望它能帮助别人

a) 实现映射器:

public class MyExceptionMapper implements ExceptionMapper<Throwable>, ResponseErrorMapper {
    ...
并可能引发

javax.ws.rs.ProcessingException: Could not find exception type for given ExceptionMapper class: class com...MyExceptionMapper.
c) 将其注册为资源:

ResourceConfig config = new ResourceConfig();
config.register(new MyExceptionMapper());

d) 还要确保强制执行处理错误:

config.setProperties(new LinkedHashMap<String, Object>() {{
    put(org.glassfish.jersey.server.ServerProperties.PROCESSING_RESPONSE_ERRORS_ENABLED, true);
}});
config.setProperties(新LinkedHashMap(){{
put(org.glassfish.jersey.server.ServerProperties.PROCESSING\u RESPONSE\u ERRORS\u ENABLED,true);
}});

如果您正在使用Spring,并且希望基于
@Path
@Provider
注释的存在以编程方式注册提供程序,则可以使用以下技术

@Component
public class JerseyConfig extends ResourceConfig {

  @Autowired
  private ApplicationContext applicationContext;

  @PostConstruct
  public init() {

    applicationContext.getBeansWithAnnotation(Path.class).values().forEach(
      component -> register(component.getClass())
    );
    applicationContext.getBeansWithAnnotation(Provider.class).values().forEach(
      this::register
    );
  }
}

为什么
注册(new MyProvider())
而不是
注册(MyProvider.class)
。除非您想将内容注入映射器,否则最好按类注册。这只是一个例子。我真的没有理由选择这种方式。我当时的感觉:——)
config.register(MyExceptionMapper.class);
config.setProperties(new LinkedHashMap<String, Object>() {{
    put(org.glassfish.jersey.server.ServerProperties.PROCESSING_RESPONSE_ERRORS_ENABLED, true);
}});
@Component
public class JerseyConfig extends ResourceConfig {

  @Autowired
  private ApplicationContext applicationContext;

  @PostConstruct
  public init() {

    applicationContext.getBeansWithAnnotation(Path.class).values().forEach(
      component -> register(component.getClass())
    );
    applicationContext.getBeansWithAnnotation(Provider.class).values().forEach(
      this::register
    );
  }
}