如何在jersey中以编程方式注册我的提供者,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();
}
}
这是正确的做法吗?
如果您正在使用Spring,并且希望基于路径和提供者注释的存在以编程方式注册提供者,那么可以使用以下技术
@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
);
}
}
虽然@PaulSamsotha的答案是正确的,但仍然存在实现技巧。我想和大家分享,希望它能帮助别人。
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);
}});
我猜您没有资源配置,因为您似乎不确定如何使用它。首先,它不是必需的。如果你使用它,它应该是它自己的独立类。您可以在那里注册映射器。
public class AppConfig extends ResourceConfig {
public AppConfig() {
register(new MyProvider());
}
}
但你可能正在使用网络。xml。在这种情况下,您可以使用以下
<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>
看看Jersey 2中的ResourceConfig类到底是什么?有关不同部署模型的更多信息。部署应用程序有几种不同的方法。您甚至可以混合搭配(web.xml和ResourceConfig)。
问题内容: 如何在实现由jersey API提供的Exceptionmapper的jersey中以编程方式注册我的提供程序?我不想使用@Provider批注,而不想使用ResourceConfig注册提供程序,我该怎么做? 例如: 这是正确的方法吗? 问题答案: 我猜您没有,因为您似乎不确定如何使用它。首先,它不是必需的。如果您 确实 使用它,那应该是它自己的单独的类。您可以在那里注册映射器。 但
我有一个作为上的面板和一个按钮。如果我按下按钮,我希望显示滚动的地图摘录。 我试图通过lat/lon设置另一个显示位置,但我不知道如何获得旧的mapcenter lat/lon值..? 我的按钮Actionlistener,它应该显示一个稍微向上移动的地图摘录: 但是我不知道如何获得地图中心当前的LAT/LON值。我如何获得它们?
首先,我对这个问题太长表示最诚挚的歉意,但老实说,我不知道如何缩短它,因为每个部分都是一个特例。诚然,我可能对此视而不见,因为我已经把头撞到墙上好几天了,我开始绝望了。 我向所有通读这本书的人表示最大的尊重和感谢。 我希望能够通过使用Jersey ExceptionMapers将Shiro的AuthenticationException及其子类映射到JAX-RS响应,Jersey例外映射器是使用G
有没有办法在不使用REST操作的情况下从Eureka服务器中删除注册实例?哪个是包含所有应用程序的数据结构? (很明显,我想删除他们在Eureka服务器中编写代码)。
我正在尝试使用我自己的应用程序实现或扩展的ResourceConfig或PackageResourceConfig来配置我的Jersey应用程序。因此,我的第一次尝试是将现有的web.xml(实际上,由于开发的库性质,我使用的是web-fragment.xml)配置移植到MyApplication实现。 当我使用第二个版本时,我会收到以下信息 正如您所看到的,是第一个注册的类,但由于它不是公共的,
我正在使用Pact Go实现来尝试合同测试。我做了一个不起作用的提供者测试,因为我需要模拟我的服务对Twilio的请求。 我已经为我的消费者和这个提供者之间的契约创建了一个Pact对象,然后为我的提供者和twilio之间的契约创建了另一个称为twilioPact的对象。我已经为Twilioendpoint添加了一个POST的交互,但是在pact.log中我没有看到它被注册。我的测试正确地发出了请求