是否有一种优雅的方式(过滤器、 Hook )在 Jersey 中拦截未编码的实体(及其注释),然后再访问 Web 服务资源方法——那些用 @POST、@PUT 注释的方法。
我确实需要实体本身及其上的任何注释,然后使用 validator 注释的属性对该实体执行验证(看起来像 JSR 303,但我们不使用元数据注释整个 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 完全工作,因为我只是委托(delegate)给 ObjectMapper 来反序列化 JSON。除此之外,我收到了参数的注释并且一切正常。但是,当我需要反序列化 XML 时,事情就崩溃了。我不知道如何获取 Jersey 会使用的原始反序列化器并委托(delegate)给它。我也觉得我在不必要地重写 Jersey 的部分,并且如果 jersey 在 MessageBodyReader 之后和实现调用允许自身扩展的 Web 资源服务之前有一个层,我宁愿停止使用 MessageBodyReader 作为一个 hacky 集成点,这样我可以向流中添加自定义行为。
最终,Jersey 是否有任何扩展点可以将未编码的实体和任何参数注释交给我,并允许我进行自定义处理?或者我是否必须自己弄清楚如何解码实体(使用 JAXBContext 或其他)?可能求助于 AOP?将 validator 注入(inject)资源类并放弃注释想法?
Jersey 版本:1.5
最佳答案
Ultimately, does Jersey have any extension points where it can hand me the unmarshalled entity and any of it's parameter anntotations and allow me to do custom handling?
是的,在 Jersey 1.x 中有一个 SPI,您可以在其中提供自己的方法调用程序。我从未实现过 SPI,但据我所知,它是在任何 MessageBodyReader 或过滤器之后调用的。看看ResourceMethodCustomInvokerDispatchProvider .来自 Javadocs:
An implementation (a service-provider) identifies itself by placing a provider-configuration file (if not already present), "com.sun.research.ws.rest.spi.invoker.ResourceMethodCustomInvokerDispatchProvider" in the resource directory META-INF/services, and including the fully qualified service-provider-class of the implementation in the file.
This interface is similar to ResourceMethodDispatchProvider, but allows to use a custom JavaMethodInvoker instance, which will be used to make the final Java method call.
如果您实现 ResourceMethodCustomInvokerDispatchProvider,您应该能够提供自己的 JavaMethodInvoker它将有权访问被调用的资源方法,包括它的所有参数和注释。
请注意,以上所有内容均适用于 Jersey 1.x。在 Jersey 2 中,ResourceMethodInvocationHandlerProvider 提供了类似的功能。
关于java - Jersey JAXRS 过滤器,在访问资源(Web 服务)之前提供未编码的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13866613/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我正在尝试使用ruby和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru
在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo
我有一个服务模型/表及其注册表。在表单中,我几乎拥有服务的所有字段,但我想在验证服务对象之前自动设置其中一些值。示例:--服务Controller#创建Action:defcreate@service=Service.new@service_form=ServiceFormObject.new(@service)@service_form.validate(params[:service_form_object])and@service_form.saverespond_with(@service_form,location:admin_services_path)end在验证@ser
我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b