2.4. 已知的 CXF 问题
- CEQ-5348 WS-SecurityPolicy, WS-Trust
-
当您将 WS-SecurityPolicy 或 WS-Trust 与 Camel CXF 消费者搭配使用时,例如
from ("cxf:…"),SOAP 端点会抛出以下异常:
SoapFault: BSP:R3227: A SECURITY_HEADER MUST NOT contain more than one TIMESTAMP
您可以使用与 Quarkiverse CXF 扩展相同的方法部署 SOAP 端点来解决此问题。
首先,您需要实施将您的消息转发到 Camel 路由的服务端点接口(SEI)。例如,如果您的 SEI 类似如下:
@WebService(targetNamespace = "https://quarkiverse.github.io/quarkiverse-docs/quarkus-cxf/ws-securitypolicy")
public interface WssSecurityPolicyHelloService {
@WebMethod
String sayHello(String name);
}
然后,您必须配置 SEI 的实现,如下所示:
@WebService(portName = "EncryptSecurityServicePort", serviceName = "WssSecurityPolicyHelloService", targetNamespace = "https://quarkiverse.github.io/quarkiverse-docs/quarkus-cxf/ws-securitypolicy", endpointInterface = "org.apache.camel.quarkus.component.cxf.soap.securitypolicy.server.cxf.way.it.WssSecurityPolicyHelloService")
public class WssSecurityPolicyHelloServiceImpl implements WssSecurityPolicyHelloService {
@Inject
ProducerTemplate producerTemplate;
public String sayHello(String name) {
return producerTemplate.requestBody("direct:myDirectEndpoint", name, String.class);
}
}
接下来,在 application.properties 文件中,您必须配置服务的路径。例如:
quarkus.cxf.path=/soap
quarkus.cxf.endpoint."/security-policy-hello".implementor=org.apache.camel.quarkus.component.cxf.soap.securitypolicy.server.cxf.way.it.WssSecurityPolicyHelloServiceImpl
在本例中,您的 Camel 路由通常以 from ("cxf:bean:myCxfHelloEndpoint") 开头,它现在 从("direct:myDirectEndpoint") 开始。
- CEQ-5286 MTOM Attachments: 在使用 AWT Image 参数调用 CXF 服务时 Unmarshalling Error
如果您的服务端点接口(SEI)在其任何方法签名中引用
java.awt.Image,则端点会抛出类似如下的错误:-
{{Unmarshalling Error: unexpected element (uri:"", local:"arg0").预期的元素为(none)}} -
unmarshalling Error: unexpected element (uri:"https://quarkiverse.github.io/quarkiverse-docs/quarkus-cxf/test/mtom-awt", local:"data")。预期的元素为(none)
-
您可以通过在请求或响应数据对象中嵌套 java.awt.Image 来解决此问题。例如,您可以将 SEI 配置为如下:
@WebService(name = "ImageService", targetNamespace = ImageService.NS)
@MTOM
public interface ImageService {
public static final String NS = "https://quarkiverse.github.io/quarkiverse-docs/quarkus-cxf/test/mtom-awt";
@WebMethod
Image downloadImage(@WebParam(name = "name", targetNamespace = NS) String name);
@WebMethod
String uploadImage(String name, Image image);
}
要使用这个临时解决方案,您应该配置 SEI,如下所示:
@WebService(name = "ImageService", targetNamespace = ImageService.NS)
@MTOM
public interface ImageService {
public static final String NS = "https://quarkiverse.github.io/quarkiverse-docs/quarkus-cxf/test/mtom-awt";
@WebMethod
ImageData downloadImage(@WebParam(name = "name", targetNamespace = NS) String name);
@WebMethod
String uploadImage(ImageData image);
}
@XmlType(name = "imageData", namespace = "http://org.jboss.ws/xop/doclit")
public class ImageData {
private Image data;
private String name;
public ImageData() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Image getData() {
return data;
}
public void setData(Image data) {
this.data = data;
}
}
- 在方法签名中包含带有 postped 初始化的类的 CEQ-4769 CXF 客户端无法编译到原生
-
当服务端点接口(SEI)的客户端在其任意方法中引用
java.awt.Image时,应用程序无法编译到原生。这个问题还没有已知的临时解决方案,但您仍可在 JVM 模式中使用受影响的客户端。