gpt4 book ai didi

java - Camel POST RestService 接受 JSONArray : annotations and parsing errors

转载 作者:行者123 更新时间:2023-12-02 10:41:32 28 4
gpt4 key购买 nike

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

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

Content-Type:application/json;charset=UTF-8

[
{
"aaa": "TEST",
"bbb": "TEST",
"ccc": 5004000
},
{
"aaa": "TEXT",
"bbb": "TEXT",
"ccc": 5004001
},
...
]

我的问题是配置一些东西以使 POST 正文正确反序列化...

这是路由定义:

from("cxfrs:bean:messageServer").choice()
.when(header("operationName").isEqualTo("postJsonMessage"))
.beanRef("messageService", "postJsonMessage")
.end();

现在,通过 beanRef 行引用的服务定义:

@Path("/root-path/")
public class MyService {
private final Logger logger = LoggerFactory.getLogger(MyService.class);

@POST
@Path("/message/")
@Consumes(MediaType.APPLICATION_JSON + ";charset=UTF-8")
public void postJsonMessage(@Body final List<CustomMessage> data) {
logger.info("body size :" + data.size());
}
}

以及描述未序列化列表的项目的 POJO:

public class CustomMessage {
private String aaa;
private String bbb;
private int ccc;

// ...getters and setters...
}

当我在 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

但是,如果我在 POJO 上使用 @XMLRootElement,则会出现 JSON 解析异常:

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?

提前感谢您的帮助:)

最佳答案

最后,通过使用 org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider@Body 参数的数组类型定义,找到了解决我的问题的方法:

因此,在 camel-context.xml 中,我们定义了一个提供程序并在 osgi 中安装了关联的库:

<cxf:rsServer id="messageServer"
address="http://0.0.0.0:${rest.service.message.port}"
serviceClass="com.example.service.MyService">
<cxf:providers>
<bean class="org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider" />
</cxf:providers>
</cxf:rsServer>

所需的库是(在我们的环境中):

install mvn:org.codehaus.jackson/jackson-core-asl/1.9.12
install mvn:org.codehaus.jackson/jackson-mapper-asl/1.9.12
install mvn:org.codehaus.jackson/jackson-jaxrs/1.9.12
install mvn:org.codehaus.jackson/jackson-xc/1.9.12

然后,服务方法签名被修改为需要一个 CustomMessage 对象数组:

    @POST
@Path("/message/")
@Consumes(MediaType.APPLICATION_JSON + ";charset=UTF-8")
public void postJsonMessage(@Body final CustomMessage[] data) {
// process data...
}

此外,类型定义已添加到路由构建器中:

    from("cxfrs:bean:messageServer").choice()
.when(header("operationName").isEqualTo("postJsonMessage"))
.convertBodyTo(CustomMessage[].class)
.beanRef("messageService", "postJsonMessage")
.end();

关于java - Camel POST RestService 接受 JSONArray : annotations and parsing errors,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52894128/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com