我在其余服务中看到了以下代码段
@POST
@Consumes("application/xml")
@Path("/ProjectConfiguration/{onetimetoken}")
public void createProjectConfiguration(@PathParam("onetimetoken") String oneTimeToken,
CreateProjectConfigurationRequest request) throws IntegratedAppFault {
// NOOPS
}
在此变量值中,oneTimeToken由路径中的内容初始化。但我怀疑的是如何初始化CreateProjectConfigurationRequest类型的请求对象。我们如何自由地在这些方法中拥有任何参数。这是怎么回事?如何保证初始化。
答案 0 :(得分:6)
上述方法期望HTTP POST请求在正文中包含XML消息。您可以告诉,因为该方法使用@POST
和@Consumes("application/xml")
进行了注释。 Resteasy看到您的方法签名中有CreateProjectConfigurationRequest
类型,该类型使用JAXB注释进行注释,并将HTTP请求的主体绑定到该对象。
您还可以使用@Context
注释注入以下类的实例。
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消息。
我们知道这一点是因为:
@POST
进行注释,表明它是由POST请求触发的。@Consumes(application/xml)
进行注释,表明它仅由Content-Type
的HTTP 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
Content-Type
application/xml
和<CreateProjectConfigurationRequest>
<id>123</id>
<name>test</name>
</CreateProjectConfigurationRequest>
发送HTTP POST请求时,我们的方法将被调用。
CreateProjectConfigurationRequest
然后,Resteasy JAXB Provider将获取传入的XML并基于内省对象和我们在其上添加的注释创建@PathParam("onetimetoken")
对象。
然后您的方法将运行并打印oneTimeToken(使用{{1}}注释从路径中检索)并请求。