【问题标题】:jaxrs/resteasy custom method paramaterjaxrs/resteasy 自定义方法参数
【发布时间】:2014-10-28 21:46:09
【问题描述】:

我想让我的 JaxRs 资源采用自定义方法参数,该参数是从请求中的某个参数构建的。
与从主体创建的另一个对象结合使用的东西。 比如:

 @Resource
 public class MyResource {
      @Path("/resource")
      public Object resource(MyResourceDTO body, AConfiguration conf){

      }
 }

AConfiguration 是从请求中的某些标头创建的。

我怎样才能实现它?

我需要类似春天 webargumentresovler 的东西:http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/bind/support/WebArgumentResolver.html

对于我的情况,MyResource 是一个子资源,该方法在这种情况下也应该可以工作......

【问题讨论】:

  • 身体携带物品没有问题。你想通过你的头部传递一个配置对象吗?
  • 我想从 HttpRequest 中创建AConfiguration,比如获取 2 个 Headers 和 1 个查询参数,或者类似的东西,自定义对象的创建
  • My answer 在这里几乎可以解决您的用例。干杯!

标签: rest jax-rs resteasy


【解决方案1】:

您可以使用如下所示的内容。您的 conf 对象已作为 json 从客户端发送。如果conf 对象中的参数必须动态更改,则必须遵循第二种方法。

 @Resource
 public class MyResource {

      @POST
      @Consumes("application/json")
      @Path("/resource")
      public Object resource(AConfiguration conf){
      // This method can receive multiple objects here. Currently it receives
      // conf object only as the payload of the post method.  
      }

 }

要动态改变conf对象,可以发送jsonString。

      public Object resource(String confJson){
      // Collect parameters manually here.
      }

在您的pom.xml 中,您应该包括,

  <dependency>
        <groupId>org.jboss.resteasy</groupId>
        <artifactId>resteasy-jackson-provider</artifactId>
        <version>2.3.1.GA</version>
  </dependency>

编辑:

您可以将 json 字符串设置为标头参数(但这不是最佳做法。)或者您可以随意设置不同的标头并使用 HttpHeaders 访问它们。 Here 就是一个例子。

      public Object resource(@Context HttpHeaders confHeaders){
      // Collect parameters manually.
      String confJson = confHeaders.getRequestHeader("confJson").get(0);
      // cast your `confJson` to `AConfiguration aConf` here.
      // process query params and set them to aConf here.
      }

【讨论】:

  • 我已经发送了一个 Json,conf 应该从 headers 构建
  • @rascio 我添加了另一个示例。看看吧。
  • 但是使用@Context 注释我可以使用自定义对象吗?要创建AConfiguration,我需要对一些标头和查询字符串参数进行一些计算。我想将计算出的对象传递给资源,而不是原始标头和参数。
  • @rascio 如果你想将计算出的对象获取到资源中,我认为你必须实现一个PreProcessInterceptor (docs.jboss.org/resteasy/docs/1.1.GA/userguide/html/…)。否则我将修改我的示例,以便您可以在资源中处理它。
【解决方案2】:

如果您添加 DTO 作为资源方法的参数,您的 JAX-RS 运行时将尝试将请求的主体转换为这种类型。您还可以添加任何 @xParam 参数,例如 @QueryParam 作为资源方法的参数。 (唯一的例外是 @FormParam,因为它们位于正文中)。

如果您想将多个参数封装在一个对象中,您可以使用@BeanParam。您的配置类可能如下所示:

public class Configuration {

    @QueryParam("foo")
    private String foo;

    @HeaderParam("bar")
    private String bar;

    // getters + setters

}

并且可以这样使用:

@POST
public Response someMethod(Dto dto, @BeanParam Configuration conf) {}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-08
    • 2014-08-20
    • 1970-01-01
    • 2014-10-07
    相关资源
    最近更新 更多