簡體   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