繁体   English   中英

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

[英]Registering a provider programmatically in jersey which implements exceptionmapper

如何以编程方式在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();
    }
}

这是正确的方法吗?

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

public class AppConfig extends ResourceConfig {
    public AppConfig() {
        register(new MyProvider());
    }
}

但是你可能正在使用web.xml。 在这种情况下,您可以使用以下<init-param>注册提供程序

<servlet>
    <servlet-name>MyApplication</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>jersey.config.server.provider.classnames</param-name>
        <param-value>
            org.foo.providers.MyProvider
        </param-value>
    </init-param>
</servlet>

有关不同部署模型的更多信息,请查看应用程序部署和运行时环境 部署应用程序有几种不同的方法。 你甚至可以混合搭配(web.xml和ResourceConfig)。

虽然@ paul-samsotha的答案是正确的,但仍有实施技巧。 我想分享它并希望它会帮助某人。

a)实现你的映射器:

public class MyExceptionMapper implements ExceptionMapper<Throwable>, ResponseErrorMapper {
    ...

b)确保声明泛型类型,否则永远不会调用映射器

public class MyExceptionMapper implements ExceptionMapper/* no generic declaration */, 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());

要么

config.register(MyExceptionMapper.class);

d)确保您也强制执行处理错误:

config.setProperties(new LinkedHashMap<String, Object>() {{
    put(org.glassfish.jersey.server.ServerProperties.PROCESSING_RESPONSE_ERRORS_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
    );
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM