Java 接受JSONArray的Camel-POST-rest服务:注释和解析错误
我正在尝试构建一个ApacheCamel(v2.15)路由来处理REST服务上的POST请求 预期的POST请求如下所示(一个JSONArray,表示所有JSONObject都是单一给定类型的实例的列表):Java 接受JSONArray的Camel-POST-rest服务:注释和解析错误,java,json,apache-camel,Java,Json,Apache Camel,我正在尝试构建一个ApacheCamel(v2.15)路由来处理REST服务上的POST请求 预期的POST请求如下所示(一个JSONArray,表示所有JSONObject都是单一给定类型的实例的列表): 内容类型:application/json;字符集=UTF-8 [ { “aaa”:“测试”, “bbb”:“测试”, “ccc”:5004000 }, { “aaa”:“文本”, “bbb”:“文本”, “ccc”:5004001 }, ... ] 我的问题是如何配置内容以正确地取消序列
内容类型:application/json;字符集=UTF-8
[
{
“aaa”:“测试”,
“bbb”:“测试”,
“ccc”:5004000
},
{
“aaa”:“文本”,
“bbb”:“文本”,
“ccc”:5004001
},
...
]
我的问题是如何配置内容以正确地取消序列化帖子正文…
以下是路线定义:
from(“cxfrs:bean:messageServer”).choice()
.when(header(“operationName”).isEqualTo(“postJsonMessage”))
.beanRef(“messageService”、“postJsonMessage”)
.end();
现在,通过beanRef行引用的服务定义:
@Path(“/root Path/”)
公共类MyService{
私有最终记录器Logger=LoggerFactory.getLogger(MyService.class);
@职位
@路径(“/message/”)
@使用(MediaType.APPLICATION_JSON+“charset=UTF-8”)
public void postJsonMessage(@Body final List data){
logger.info(“body size:+data.size());
}
}
以及描述未序列化列表项的POJO:
公共类自定义消息{
私有字符串aaa;
私有字符串bbb;
私营企业;
//…能手和二传手。。。
}
当我在POJO上不使用注释时,出现了以下异常:
JAXRSUtils | 152 - org.apache.cxf.cxf-core - 3.0.6 | No message body reader has been found for class java.util.List, ContentType: application/json;charset=UTF-8
AbstractJAXBProvider | 152 - org.apache.cxf.cxf-core - 3.0.6 | javax.xml.stream.XMLStreamException: ParseError at [row,col]:[0,1] Message: A JSONObject text must begin with '{' at character 1 of [
{
"aaa": "TEST",
"bbb": "TEST",
"ccc": 5004000
},
...
但是如果我在POJO上使用@XMLRootElement,我会得到一个JSON解析异常:
JAXRSUtils | 152 - org.apache.cxf.cxf-core - 3.0.6 | No message body reader has been found for class java.util.List, ContentType: application/json;charset=UTF-8
AbstractJAXBProvider | 152 - org.apache.cxf.cxf-core - 3.0.6 | javax.xml.stream.XMLStreamException: ParseError at [row,col]:[0,1] Message: A JSONObject text must begin with '{' at character 1 of [
{
"aaa": "TEST",
"bbb": "TEST",
"ccc": 5004000
},
...
那么我如何配置解析器来将发布的数据解释为JSONArray而不是JSONObject呢?
提前感谢您的帮助:)我记得曾经遇到过类似的问题(但在编组方面)。 解决方法是围绕列表定义一个包装器,这样Jackson库现在就能够解组JSON负载
public class CustomMessageList extends ArrayList<CustomMessage> {};
@POST
@Path("/message/")
@Consumes(MediaType.APPLICATION_JSON + ";charset=UTF-8")
public void postJsonMessage(@Body final CustomMessageList data) {
logger.info("body size :" + data.size());
}
公共类CustomMessageList扩展了ArrayList{};
@职位
@路径(“/message/”)
@使用(MediaType.APPLICATION_JSON+“charset=UTF-8”)
public void postJsonMessage(@Body final CustomMessageList数据){
logger.info(“body size:+data.size());
}
希望这有帮助。最后,通过使用
org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider
和@Body
参数的数组类型定义,找到了我的问题的解决方案:
因此,在camel context.xml
中,我们定义了一个提供者,并在osgi中安装了相关的库:
所需的库是(在我们的环境中):
install mvn:org.codehaus.jackson/jackson-core-asl/1.9.12
安装mvn:org.codehaus.jackson/jackson-mapper-asl/1.9.12
安装mvn:org.codehaus.jackson/jackson-jaxrs/1.9.12
安装mvn:org.codehaus.jackson/jackson-xc/1.9.12
然后,修改了服务方法签名,以期望得到CustomMessage
对象的数组:
@POST
@路径(“/message/”)
@使用(MediaType.APPLICATION_JSON+“charset=UTF-8”)
public void postJsonMessage(@Body final CustomMessage[]数据){
//进程数据。。。
}
此外,在管线生成器中添加了类型定义:
from(“cxfrs:bean:messageServer”).choice()
.when(header(“operationName”).isEqualTo(“postJsonMessage”))
.convertBodyTo(CustomMessage[].class)
.beanRef(“messageService”、“postJsonMessage”)
.end();
感谢您的回答,我无法让它按原样工作,但这是一个很好的提示,可以尝试更改@Body参数的类型定义中的内容。。。