带有List的JAX-RS @HeaderParam,只填充了一个逗号分隔元素

时间:2017-03-19 09:24:35

标签: jersey jax-rs

这是一个特定于JAX-RS的问题。根据{{​​1}}文档:

https://docs.oracle.com/javaee/7/api/javax/ws/rs/HeaderParam.html

  

Be List,Set或SortedSet,其中T满足上面的2,3或4。生成的集合是只读的。   如果类型不是上面5中列出的集合类型之一,并且header参数由多个值表示,则使用参数的第一个值(词法)。

从文档中可以清楚地看出,如果标题有多个值,那么它可以映射到集合。 这是我的例子:

@HeaderParam

客户:

@Path("/")
public class TestResource {

  @GET
  @Path("test")
  public String test(@HeaderParam("myHeader") List<String> list) {
    System.out.println(list.size());
    list.stream().forEach(System.out::println);
    return "response";
  }

}

服务器控制台上的输出:

Client client = ClientBuilder.newClient();
WebTarget target = client.target("http://localhost:8080/test");
String response = target.request()
                    .header("myHeader", "a")
                    .header("myHeader", "b")
                    .header("myHeader", "c,d")
                    .get(String.class);

client.close();

只有一个元素填充'a,b,c,d'而不是4个单独的元素。 我在这里错过了什么?谷歌搜索问题,但没有找到任何答案。 我正在使用Jersey 2.25.1。并在嵌入式tomcat中运行它:

1
a,b,c,d  

由于

2 个答案:

答案 0 :(得分:1)

这不是您的应用程序的错误。它按设计工作。多个标头参数以逗号分隔。

查看Standard for adding multiple values of a single HTTP Header to a request or response它引用了http协议rfc以使用多个标头属性。

答案 1 :(得分:0)

对我来说似乎是个错误,但他们声称这是他们打算Jersey发挥作用的方式(根据https://github.com/jersey/jersey/issues/2436)。这种推理对我来说似乎值得怀疑。 RFC 2616并不像它们暗示的那么简单。 RFC 2616基本上说的是,如果标头在语义上等效于逗号分隔的列表,则标头可以多次出现。用逗号分隔的列表是否应视为列表完全取决于开发人员,而且很明显,您清楚地使用List类型和HeaderParam注释表明了这一意图。