Java 在实现exceptionmapper的jersey中以编程方式注册提供程序
我如何在jersey中以编程方式注册我的提供者,它实现了jersey API提供的Exceptionmapper?我不想使用@Provider注释,而是想使用ResourceConfig注册提供程序,我该怎么做 例如: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() {
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
);
}
}