将MessageBodyWriter和GenericEntity与集合一起使用时,CXF 2.7.x和3.2.x之间的行为更改

上下文

我正在使用像这样的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的新方法是什么。

sjh102495 回答:将MessageBodyWriter和GenericEntity与集合一起使用时,CXF 2.7.x和3.2.x之间的行为更改

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3082302.html

大家都在问