当前位置: 首页 > 知识库问答 >
问题:

在jersey中以编程方式注册实现异常映射器的提供程序

丁鸿云
2023-03-14

如何在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();
    }
}

这是正确的做法吗?

共有3个答案

鲁成天
2023-03-14

如果您正在使用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
    );
  }
}
章茂
2023-03-14

虽然@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);
}});
吴升
2023-03-14

我猜您没有资源配置,因为您似乎不确定如何使用它。首先,它不是必需的。如果你使用它,它应该是它自己的独立类。您可以在那里注册映射器。

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中我没有看到它被注册。我的测试正确地发出了请求