谁初始化@Post(或任何jax rs注释)执行的方法中的参数?

时间:2013-10-01 10:57:07

标签: java rest jax-rs resteasy restlet

我在其余服务中看到了以下代码段

    @POST
    @Consumes("application/xml")
    @Path("/ProjectConfiguration/{onetimetoken}")
    public void createProjectConfiguration(@PathParam("onetimetoken") String oneTimeToken,
            CreateProjectConfigurationRequest request) throws IntegratedAppFault {
        // NOOPS
    }

在此变量值中,oneTimeToken由路径中的内容初始化。但我怀疑的是如何初始化CreateProjectConfigurationRequest类型的请求对象。我们如何自由地在这些方法中拥有任何参数。这是怎么回事?如何保证初始化。

1 个答案:

答案 0 :(得分:6)

上述方法期望HTTP POST请求在正文中包含XML消息。您可以告诉,因为该方法使用@POST@Consumes("application/xml")进行了注释。 Resteasy看到您的方法签名中有CreateProjectConfigurationRequest类型,该类型使用JAXB注释进行注释,并将HTTP请求的主体绑定到该对象。

您还可以使用@Context注释注入以下类的实例。

  1. javax.ws.rs.core.HttpHeaders
  2. javax.ws.rs.core.UriInfo
  3. javax.ws.rs.core.Request
  4. javax.servlet.HttpServletRequest
  5. javax.servlet.HttpServletResponse
  6. javax.servlet.ServletConfig
  7. javax.servlet.ServletContext
  8. javax.ws.rs.core.SecurityContext
  9. JAX-RS兼容框架内置了标准支持,用于将XML和Json请求体编组到方法参数中。如果您需要阅读自定义消息格式,那么您将创建一个MessageBodyReader,它将接收传入的http请求主体并将其绑定到一个参数,就像XML或Json一样。

    实施例

    下面的代码说明了如何将请求主体绑定到方法参数中的java对象。

    使用上面的示例,我们假设我们的服务公开了以下休息端点:

    @POST
    @Consumes("application/xml")
    @Path("/ProjectConfiguration/{onetimetoken}")
    public void createProjectConfiguration(@PathParam("onetimetoken") String oneTimeToken,
            CreateProjectConfigurationRequest request) throws IntegratedAppFault 
    {
        System.out.println(oneTimeToken);
        System.out.println(request.toString());
    }
    

    此端点期望接收包含CreateProjectConfigurationRequest的XML表示的HTTP POST消息。

    我们知道这一点是因为:

    1. 该方法使用@POST进行注释,表明它是由POST请求触发的。
    2. 该方法使用@Consumes(application/xml)进行注释,表明它仅由Content-Type的HTTP application/xml标头的请求触发。
    3. CreateProjectConfigurationRequest的方法参数未使用@Form@FormParam@PathParam@QueryParam@HeaderParam进行注释表示它来自请求的其他部分。
    4. 现在,让我们假设CreateProjectConfigurationRequest的定义如下:

      @XmlRootElement
      public class CreateProjectConfigurationRequest 
      {
         private int id;
         private String name;
      
         @XmlElement
         public int getId()
         {
            return id;
         }
      
         public void setId(int id)
         {
            this.id = id;
         }
      
         @XmlElement
         public String getName()
         {
            return name;
         }
      
         public void setName(String name)
         {
            this.name = name;
         }
      }
      

      现在,当我们向http://somehost/someapp/ProjectConfiguration/123abc Content-Type application/xml<CreateProjectConfigurationRequest> <id>123</id> <name>test</name> </CreateProjectConfigurationRequest> 发送HTTP POST请求时,我们的方法将被调用。

      CreateProjectConfigurationRequest

      然后,Resteasy JAXB Provider将获取传入的XML并基于内省对象和我们在其上添加的注释创建@PathParam("onetimetoken")对象。

      然后您的方法将运行并打印oneTimeToken(使用{{1}}注释从路径中检索)并请求。