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

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

例如:

public class MyProvider implements ExceptionMapper 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() { @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 ,因为你似乎不确定如何使用它。 首先,它不是必需的。 如果你确实使用它,它应该是它自己独立的类。 在那里你可以注册mapper。

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

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

  MyApplication 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, ResponseErrorMapper { ... 

b)确保声明generics类型,否则永远不会调用mapper

 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() {{ put(org.glassfish.jersey.server.ServerProperties.PROCESSING_RESPONSE_ERRORS_ENABLED, true); }});