上面的方法期望 HTTP POST 请求在正文中带有 XML 消息。您可以判断,因为该方法使用@POST
and注释@Consumes("application/xml")
。Resteasy 发现CreateProjectConfigurationRequest
您的方法签名中有一个类型,该类型使用 JAXB 注释进行注释,并将您的 HTTP 请求的主体绑定到该对象。
您还可以使用@Context
注解注入以下类的实例。
- javax.ws.rs.core.HttpHeaders
- javax.ws.rs.core.UriInfo
- javax.ws.rs.core.Request
- javax.servlet.HttpServletRequest
- javax.servlet.HttpServletResponse
- javax.servlet.ServletConfig
- javax.servlet.ServletContext
- 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
。
我们知道这一点是因为:
- 该方法带有注释,
@POST
表明它是由 POST 请求触发的。
- 该方法带有注释,
@Consumes(application/xml)
表明它仅由 HTTPContent-Type
标头为application/xml
.
- 有一个方法参数
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-Type
ofapplication/xml
和以下 XML 正文向我们发送 HTTP POST 请求时,我们的方法将被调用。
<CreateProjectConfigurationRequest>
<id>123</id>
<name>test</name>
</CreateProjectConfigurationRequest>
然后,Resteasy JAXB Provider 将获取传入的 XML,并CreateProjectConfigurationRequest
根据自省对象和我们在上面添加的注释创建一个对象。
然后,您的方法将运行并打印 oneTimeToken(使用@PathParam("onetimetoken")
注释从路径中检索)和请求。