自定义内容类型可以包含@?与jersy客户进行休息通话

时间:2015-04-23 13:13:33

标签: rest jersey content-type jersey-2.0 media-type

尝试调用仅接受application/xxxx@1.0作为内容类型的restful服务,并且服务还返回具有此内容类型的有效负载(二进制流)。

我正在使用jersey客户端拨打电话,我收到以下错误,这是否意味着jersey客户端不支持@ inside内容的任何内容类型?

由于

  

引起:java.lang.IllegalArgumentException:解析媒体时出错   输入'application/x-xxx-data@1.0'   at org.glassfish.jersey.message.internal.MediaTypeProvider.fromString(MediaTypeProvider.java:92)   at org.glassfish.jersey.message.internal.MediaTypeProvider.fromString(MediaTypeProvider.java:60)   在javax.ws.rs.core.MediaType.valueOf(MediaType.java:179)   at org.glassfish.jersey.message.internal.InboundMessageContext $ 5.apply(InboundMessageContext.java:446)   ... 48更多引起:java.text.ParseException:预期的分隔符';'代替 '@'   在org.glassfish.jersey.message.internal.HttpHeaderReader.nextSeparator(HttpHeaderReader.java:115)   在org.glassfish.jersey.message.internal.HttpHeaderReader.readParameters(HttpHeaderReader.java:249)   在org.glassfish.jersey.message.internal.HttpHeaderReader.readParameters(HttpHeaderReader.java:242)   at org.glassfish.jersey.message.internal.MediaTypeProvider.valueOf(MediaTypeProvider.java:110)   在org.glassfish.jersey.message.internal.MediaTypeProvider.fromString(MediaTypeProvider.java:90)

1 个答案:

答案 0 :(得分:0)

请参阅Media Type Specifications and Registration Procedures: 4.2. Naming Requirements

  

类型和子类型名称必须符合以下ABNF:

 type-name = reg-name
 subtype-name = reg-name

 reg-name = 1*127reg-name-chars
 reg-name-chars = ALPHA / DIGIT / "!" /
                   "#" / "$" / "&" / "." /
                   "+" / "-" / "^" / "_"`

@不是允许的字符之一。你可以这样"application/xxx!#$&.+-^_1.0",它会起作用。

流向异常:

  • GrammarUtil维护一份SEPARATORS

    列表
    private static final char[] SEPARATORS =
        {'(', ')', '<', '>', '@', ',', ';', ':', '\\', '"', 
         '/', '[', ']', '?', '=', '{', '}', ' ', '\t'};
    

    此列表是其他类型的列表,用于填写可能的字符列表。在此过程中,实际使用的唯一字符是/;字符,它们是媒体类型的分隔符,例如application/json;charset=utf-8

  • first separator is set/。处理媒体类型字符串的目的是获取MediaType实例,其构造类似于MediaType(type, subType, params),其中typeapplicationsubType为{{1} } jsonparams,包括Map

  • 遍历字符,直到遇到调用nextSeparator('/')的第一个分隔符charset=utf-8。这很好,因为它们符合预期。但是,当到达下一个分隔符/时,将调用@,就像预期的下一个分隔符一样。一个ParseException is thrown

    nextSepartor(';')