上下文
我正在使用像这样的Camel路由来公开我的REST服务:
from("cxfrs://bean://rsProductServerV1?bindingStyle=SimpleConsumer&synchronous=true")
.process(new ProductServiceProcessor());
在蓝图中,我有cxfServer声明:
<cxf:rsServer id="rsProductServerV1" address="/product/v1"
serviceclass="org.mycompany.product.rest.ProductServiceRest"
loggingFeatureEnabled="true">
<cxf:providers>
<!-- Body Writers -->
<ref component-id="productXMLMessageBodyWriter" />
</cxf:providers>
</cxf:rsServer>
在处理器中,我有以下代码:
@Override
public void process(Exchange exchange) throws Exception {
// Few operations not relevant for this question here....
// Internal Service retrieving products. The getProducts() methods returns an object of type: ArrayList<ProductMessage>.
Collection<ProductMessage> products = mySvc.getProducts(requestBuilder.build());
// I needed to wrap my collection in a GenericEntity object in order to preserve information on the parameterised type.
// This was working well in CXF 2.7.x
GenericEntity<Collection<ProductMessage>> entities = new GenericEntity<Collection<ProductMessage>>(products) {
};
// Set the response body.
Response res = Response.ok(entities)
.header(Exchange.CONTENT_TYPE,MediaType.APPLICATION_XML)
.build();
exchange.getOut().setBody(res);
}
故障部分
,在productXMLMessageBodyWriter
中,我有了方法(还有其他方法):
public boolean isWriteable(Class<?> type,Type genericType,Annotation[] annotations,MediaType mediaType) {
if (!mediaType.getSubtype().matches("xml"))
return false;
if (!Collection.class.isAssignableFrom(type))
return false;
// This code was working in CXF 2.7.x and throw an Exception in CXF 3.2.10
// java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
ParameterizedType parameterizedType = (ParameterizedType) genericType;
Type[] actualTypeArgs = (parameterizedType.getactualTypeArguments());
if (actualTypeArgs.length == 1 && actualTypeArgs[0].equals(ProductMessage.class)) {
return true;
} else {
return false;
}
}
要将CXF 2.7迁移到3.2,我遵循了migrations guides:
并没有提及Generic实体在MessageBodyWriter处理中的任何更改。
该代码部署在ServiceMix 7.0.1(将Camel升级到2.23.0)中,并与JDK 8一起运行。
我很好奇,从GenericEntity提取ParameterizedType的新方法是什么。