【发布时间】:2016-12-28 19:45:13
【问题描述】:
我已经用 Apache camel XML 模式实现了以下路由。
<restConfiguration component="servlet" bindingMode="json" contextPath="/abc-esb/rest" port="8181">
<dataFormatProperty key="prettyPrint" value="true" />
<dataFormatProperty key="json.in.disableFeatures" value="FAIL_ON_EMPTY_BEANS,FAIL_ON_UNKNOWN_PROPERTIES" />
</restConfiguration>
<rest path="/service-http" consumes="application/json" produces="application/json">
<put type="com.abc.abcd.esb.models.UserServiceMapping" uri="/create">
<route>
<setHeader headerName="Authorization">
<simple>Basic YWRtaW46YWRtaW4=</simple>
</setHeader>
<setHeader headerName="CamelHttpMethod">
<constant>POST</constant>
</setHeader>
<setBody>
<simple>
{"SystemUserDetails":{"userName":"${body.objectDetails.userName}",
"password": "${body.objectDetails.password}"}}
</simple>
</setBody>
<to uri="http://192.168.1.20:8081/abcd/services/UserServiceRest/V1.0/users/create?bridgeEndpoint=true" />
</route>
</put>
</rest>
功能按预期发生。但骆驼返回 HTTP 500 提及以下错误。
com.fasterxml.jackson.databind.JsonMappingException: 没有序列化程序 找到上课 org.apache.camel.converter.stream.CachedOutputStream$WrappedInputStream 并且没有发现创建 BeanSerializer 的属性(以避免 异常,禁用 SerializationFeature.FAIL_ON_EMPTY_BEANS) ) com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.failForEmpty(UnknownSerializer.java:69) 在 com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.serialize(UnknownSerializer.java:32) 在 com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:130)
当我分析与此场景相关的 tcp 转储时,我发现在尝试映射来自外部 Web 服务的 {"status" : "Success"} 响应时发生了这个 HTTP 500。
UserServiceMapping 类的内容
private String serviceName;
private String serviceMethod;
private String mappedServiceObject;
private SystemUserDetails objectDetails;
// private StatusDetails statusDetails;
public String getMappedServiceObject() {
return mappedServiceObject;
}
public void setMappedServiceObject(String mappedServiceObject) {
this.mappedServiceObject = mappedServiceObject;
}
public String getServiceName() {
return serviceName;
}
public void setServiceName(String serviceName) {
this.serviceName = serviceName;
}
public String getServiceMethod() {
return serviceMethod;
}
public void setServiceMethod(String serviceMethod) {
this.serviceMethod = serviceMethod;
}
public SystemUserDetails getObjectDetails() {
return objectDetails;
}
public void setObjectDetails(SystemUserDetails objectDetails) {
this.objectDetails = objectDetails;
}
/*
* public StatusDetails getStatusDetails() { return statusDetails; }
*
* public void setStatusDetails(StatusDetails statusDetails) {
* this.statusDetails = statusDetails; }
*/
【问题讨论】:
-
由于您在查找序列化实现时遇到问题,您是否尝试过在依赖项中添加一个?通常可以在使用 REST DSL 的骆驼项目中找到像
camel-jackson、jackson-core、jackson-databind和/或org.json这样的东西 -
@Udara Seneviratne,请您尝试在
simple标签中添加resultType="java.lang.String"属性。或在setBody标记之后添加这样的<convertBodyTo type="java.lang.String"/>行。 -
@Roman 感谢您的快速回复。我试过你的建议。但问题依然存在。有没有办法映射端点请求的响应?
-
@Aleksei Bulgak 感谢您的回复。我也尝试了您的建议,但问题仍然存在。
-
@UdaraSeneviratne 你能添加你的
UserServiceMapping类的内容吗?
标签: apache-camel