Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 接受JSONArray的Camel-POST-rest服务:注释和解析错误_Java_Json_Apache Camel - Fatal编程技术网

Java 接受JSONArray的Camel-POST-rest服务:注释和解析错误

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 }, ... ] 我的问题是如何配置内容以正确地取消序列

我正在尝试构建一个ApacheCamel(v2.15)路由来处理REST服务上的POST请求

预期的POST请求如下所示(一个JSONArray,表示所有JSONObject都是单一给定类型的实例的列表):

内容类型: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参数的类型定义中的内容。。。