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

Har*_*nam 2 java rest jax-rs restlet resteasy

我在休息服务中看到了以下代码片段

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

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

gre*_*ker 6

上面的方法是期望在正文中带有XML消息的HTTP POST请求.你可以告诉,因为该方法用@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

在符合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());
}
Run Code Online (Sandbox Code Playgroud)

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

我们知道这是因为:

  1. 该方法带有注释,@POST表明它是由POST请求触发的.
  2. 该方法被注释为@Consumes(application/xml)指示它仅由具有HTTP Content-Type头的请求触发application/xml.
  3. 有的方法参数CreateProjectConfigurationRequest不与注释@Form,@FormParam,@PathParam,@QueryParam,或@HeaderParam将指示它是从请求的一些其他部分的到来.

现在,让我们假设它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;
   }
}
Run Code Online (Sandbox Code Playgroud)

现在,当我们发送一个HTTP POST请求http://somehost/someapp/ProjectConfiguration/123abcContent-Typeapplication/xml和下面的XML体我们的方法将被调用.

<CreateProjectConfigurationRequest>
  <id>123</id>
  <name>test</name>
</CreateProjectConfigurationRequest>
Run Code Online (Sandbox Code Playgroud)

然后,Resteasy JAXB Provider将获取传入的XML并CreateProjectConfigurationRequest基于内省对象和我们在其上面添加的注释创建对象.

然后,您的方法将运行并打印oneTimeToken(使用@PathParam("onetimetoken")注释从路径中检索)并请求.