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