尝试调用仅接受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)
答案 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"
,它会起作用。
流向异常:
private static final char[] SEPARATORS =
{'(', ')', '<', '>', '@', ',', ';', ':', '\\', '"',
'/', '[', ']', '?', '=', '{', '}', ' ', '\t'};
此列表是其他类型的列表,用于填写可能的字符列表。在此过程中,实际使用的唯一字符是/
和;
字符,它们是媒体类型的分隔符,例如application/json;charset=utf-8
first separator is set到/
。处理媒体类型字符串的目的是获取MediaType
实例,其构造类似于MediaType(type, subType, params)
,其中type
为application
,subType
为{{1} } json
是params
,包括Map
遍历字符,直到遇到调用nextSeparator('/')
的第一个分隔符charset=utf-8
。这很好,因为它们符合预期。但是,当到达下一个分隔符/
时,将调用@
,就像预期的下一个分隔符一样。一个ParseException
is thrown
nextSepartor(';')