gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 16:16:08 24 4
gpt4 key购买 nike

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

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

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

最佳答案

上面的方法需要一个 HTTP POST 请求,其正文中包含 XML 消息。您可以看出,因为该方法是用 @POST@Consumes("application/xml") 注解的。 Resteasy 发现您的方法签名中有一个 CreateProjectConfigurationRequest 类型,该类型使用 JAXB 注释进行注释,并将 HTTP 请求的正文绑定(bind)到该对象。

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

  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 请求正文并将其绑定(bind)到参数,就像 XML 或 Json 一样。

示例

下面的代码说明了如何将请求正文绑定(bind)到方法参数中的 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) 注释,表示它仅由 HTTP Content-Type header 为 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 发送 HTTP POST 请求时,Content-Typeapplication/xml 和以下 XML 正文我们的方法将被调用。

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

然后,Resteasy JAXB Provider 将获取传入的 XML,并基于对对象和我们在上面添加的注释进行内省(introspection)来创建一个 CreateProjectConfigurationRequest 对象。

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

关于java - 谁初始化@Post(或任何 jax rs 注释)执行的方法中的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19114404/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com