如何在cxf中设置消息正文中的自定义对象?

时间:2016-12-27 12:41:41

标签: rest cxf

我有一个带有方法自定义(GET)的REST Web服务。

List<Integer> weekDays = Arrays.asList(1, 2, 4, 5, 6);
int[] indices = IntStream.rangeClosed(0, weekDays.size())
   .filter(i -> i == 0 || i == weekDays.size() || weekDays.get(i - 1) + 1 != weekDays.get(i))
   .toArray();
int longest = IntStream.range(0, indices.length - 1).map(i -> indices[i + 1] - indices[i])
   .max().orElseThrow(NoSuchElementException::new);
System.out.println(longest);

正如您所看到的,此方法有一个参数。这是我的自定义对象。

对象UIParameters是根据作为查询字符串给出的参数构建的。

例如。 http://example.com/custom?objectType=article

UIParameters对象将包含一个字段:

@GET
@Path("/custom")
public UIResponse custom(final UIParameters uiParameters){...}

我尝试使用InInterceptor从URL获取此参数,构建UIParameter对象并设置消息内容。不幸的是,它不起作用。 之后,我为UIParameters提供了MessageBodyReader,但它仍然不起作用。

我应该怎样做才能达到这个目标?

由于

更新

在InInterceptor中,我将查询字符串复制到http标头。现在是我的MessageBodyReader中可以访问用户位置参数的URL的一部分。在这里,我可以构建我的对象UIParameters。

一切正常,但我不认为这个解决方案是最好的。

有人知道更好的解决方案吗?

1 个答案:

答案 0 :(得分:0)

注释QueryParam("")允许获取注入的所有查询参数。

您不需要拦截器,这不是推荐的方式。请参阅CXF文档http://cxf.apache.org/docs/jax-rs-basics.html#JAX-RSBasics-Parameterbeans

@GET
@Path("/custom")
public UIResponse custom(@QueryParam("") UIParameters uiParameters)

class UIParameters {
      String objectType;
}

如果您想使用查询参数自己构建bean,请使用@Context UriInfo注释

@GET
@Path("/custom")
public UIResponse custom( @Context UriInfo uriInfo){
     MultivaluedMap<String, String> params = uriInfo.getQueryParameters();
     new UIParameters().Builder()
        .objectType(params.getFirst("type"))
        .build();
}