[英]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.