2

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

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

在这个变量 oneTimeToken 的值中,由路径中的内容初始化。但我的疑问是 CreateProjectConfigurationRequest 类型的请求对象是如何初始化的。我们如何自由地在这些方法中使用任何参数。这是如何工作的?如何保证这被初始化。

4

1 回答 1

6

上面的方法期望 HTTP POST 请求在正文中带有 XML 消息。您可以判断,因为该方法使用@POSTand注释@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());
}

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

我们知道这一点是因为:

  1. 该方法带有注释,@POST表明它是由 POST 请求触发的。
  2. 该方法带有注释,@Consumes(application/xml)表明它仅由 HTTPContent-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;
   }
}

http://somehost/someapp/ProjectConfiguration/123abc现在,当我们使用 a Content-Typeofapplication/xml和以下 XML 正文向我们发送 HTTP POST 请求时,我们的方法将被调用。

<CreateProjectConfigurationRequest>
  <id>123</id>
  <name>test</name>
</CreateProjectConfigurationRequest>

然后,Resteasy JAXB Provider 将获取传入的 XML,并CreateProjectConfigurationRequest根据自省对象和我们在上面添加的注释创建一个对象。

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

于 2013-10-01T18:28:48.330 回答