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

Jersey JAXRS过滤器,在访问资源(web服务)之前提供解封实体

孙才捷
2023-03-14

我确实需要实体本身和它的任何注释,然后使用验证器注释的属性对该实体执行验证(看起来像JSR303,但我们不使用元数据注释整个bean)。从资源的实现角度来看,我的目标是能够在资源方法中键入以下内容:

@Path("/people")
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
public class PeopleService {
        @POST
        public Response createPerson(@CustomValidator("personValidator") Person person) throws URISyntaxException {
            String uri = someService.createPerson(person);
            return Response.created(new URI(uri)).entity(uri).build();
        }
    }

我开始编写一个自定义MessageBodyReader,并设法使JSON完全工作,因为我只是委托ObjectMapper来反序列化JSON。除此之外,我得到了参数的注释,一切都很好地工作了。但是,当我需要反序列化XML时,事情就崩溃了。我不知道如何获得新泽西会使用的原始反序列化器,并委托给它。我还觉得我在不必要地重写Jersey的部分,如果Jersey在MessageBodyReader之后和实现调用web资源服务之前有一个层,允许扩展它自己,以便我可以向流添加自定义行为,我更愿意停止使用MessageBodyReader作为一个讨厌的集成点。

最后,Jersey是否有任何扩展点,在那里它可以向我提供解封实体和它的任何参数Antotation,并允许我进行自定义处理?或者我必须自己解决如何解封实体(使用JAXBContext或其他)?可能诉诸AOP吗?将验证器注入资源类并放弃注释思想?

共有1个答案

陈奇希
2023-03-14

最后,Jersey是否有任何扩展点,在那里它可以向我提供解封实体和它的任何参数Antotation,并允许我进行自定义处理?

是的,在Jersey 1.x中有一个SPI,您可以在其中提供自己的方法调用器。我从未实现过SPI,但据我所知,它是在任何MessageBodyReaders或Filters之后调用的。看一下ResourceMethodCustomInvokerDispatchProvider。在Javadocs中:

实现(服务提供程序)通过将提供程序配置文件“com.sun.research.ws.rest.spi.invoker.resourceMethodCustomInvokerDispatchProvider”放置在资源目录META-INF/services中(如果不存在的话)来标识自己,并在文件中包含实现的完全限定的service-provider-class。

该接口类似于ResourceMethodDispatchProvider,但允许使用自定义JavaMethodInvoker实例,该实例将用于进行最后的Java方法调用。

如果您实现了ResourceMethodCustomInvokerDispatchProvider,您应该能够提供您自己的JavaMethodInvoker,该JavaMethodInvoker可以访问被调用的资源方法,包括它的所有参数和注释。

请注意,上面的所有内容都适用于泽西1.x。在Jersey 2中,ResourceMethodInvocationHandlerProvider提供了类似的功能。

 类似资料:
  • 问题内容: 我已经编写了REST Web服务方法,并且。以下是Web服务类`@Path(“ / service”)公共类Service { }` 在Web服务方法中,正在使用调用,而正在使用的URL是http:// localhost:8080 / xxxx / xxxx / service / val / zzzz 。zzzz是要传递的值。URL模式的和是/安全。现在,问题没有被调用,而直接调用

  • 从RESTful Web服务(通过GET)获取项目集合时,每个项目的表示形式(例如在JSON中)通常包含项目的资源标识符。这可以是资源的ID,也可以是通常包含ID的整个URI。 如果客户端需要与表示单个项的远程资源进一步交互,则需要此标识符(ID或URI)。许多人似乎认为提供整个URI而不仅仅是ID是一种很好的做法,这样客户机就与URI构造无关(例如,这就是Miguel Grinberg在本文中所

  • 使用 PHP-FPM 有多种方式来配置一个 web 服务器以提供 PHP 服务。传统(并且糟糕的)的方式是使用 Apache 的 mod_php。Mod_php将PHP 绑定到 Apache 自身,但是 Apache 对于该模块功能的管理工作非常糟糕。一旦遇到较大的流量, 就会遭受严重的内存问题。 后来两个新的可选项很快流行起来:mod_fastcgi 和 mod_fcgid。 两者均保持一定数量

  • 本文向大家介绍java web服务器实现跨域访问,包括了java web服务器实现跨域访问的使用技巧和注意事项,需要的朋友参考一下 一、CORS概述 跨源资源共享标准通过新增一系列 HTTP 头,让服务器能声明那些来源可以通过浏览器访问该服务器上的各类资源(包括CSS、图片、JavaScript 脚本以及其它类资源)。另外,对那些会对服务器数据造成破坏性影响的 HTTP 请求方法(特别是 GET

  • web3.currentProvider属性返回当前在用的通信服务提供器,如果没有的话则返回null。 调用: web3.currentProvider web3.eth.currentProvider web3.shh.currentProvider web3.bzz.currentProvider ... 返回值: Object: 当前在用的服务提供器,或者null。

  • 我想将构建信息写入属性文件。我找到了Maven资源过滤插件。这就是我的pom相关部分的样子: 如果start构建成功,但我的文件下src/main/资源将不包含构建信息。 我的属性文件如下所示: 我做错了什么?非常感谢。