骆驼 CXF:IllegalArgumentException 参数应为 X 类型
Camel CXF: IllegalArgumentException parameters should be of type X
我正在开发一个使用 CXF 调用服务的 Camel 项目。
这些服务是通过 wsdl 定义的,我无法修改它。
我用wsdl2java生成了类:我会有很多其他的远程服务,它们可能经常变化,所以我希望尽可能多地生成POJO和接口。
我生成的界面是这样的:
@WebService(targetNamespace = "http://service.company.fr", name = "myService")
@XmlSeeAlso({ObjectFactory.class})
public interface MyService {
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
@WebResult(name = "sendMessageResponse", targetNamespace = "http://service.company.fr", partName = "parameters")
@WebMethod
SendMessageResponse sendLetter(
@WebParam(partName = "parameters", name = "sendLetter", targetNamespace = "http://service.company.fr")
SendLetter parameters
) throws MessageServiceException_Exception;
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
@WebResult(name = "sendMessageResponse", targetNamespace = "http://service.company.fr", partName = "parameters")
@WebMethod
SendMessageResponse sendWebNotification(
@WebParam(partName = "parameters", name = "sendWebNotification", targetNamespace = "http://service.company.fr")
SendWebNotification parameters
) throws MessageServiceException_Exception;
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
@WebResult(name = "sendMessageResponse", targetNamespace = "http://service.company.fr", partName = "parameters")
@WebMethod
SendMessageResponse sendEmail(
@WebParam(partName = "parameters", name = "sendEmail", targetNamespace = "http://service.company.fr")
SendEmail parameters
) throws MessageServiceException_Exception;
}
我在 XML 文件中定义了 CXF 端点,如下所示:
<cxf:cxfEndpoint id="serviceEndpoint"
address="http://localhost:9081/soap/service"
serviceClass="fr.company.service.MyService">
<cxf:properties>
<entry key="dataFormat" value="POJO"/>
</cxf:properties>
</cxf:cxfEndpoint>
最后,我在 Camel 路由中调用该服务:
from(URI_SERVICE)
.process(sendEmailBodyProcessor)
.to("cxf:bean:serviceEndpoint");
sendEmailBodyProcessor
设置 body 与 SendEmail object (对应于接口的第 3 个服务)。如果我只留下我在界面中使用的服务,它可以工作,但如果我离开其他服务,我会得到这个错误:
java.lang.IllegalArgumentException: Part {http://service.company.fr}parameters should be of type fr.company.service.SendLetter, not fr.company.service.SendEmail
at org.apache.cxf.jaxb.io.DataWriterImpl.checkPart(DataWriterImpl.java:292)
at org.apache.cxf.jaxb.io.DataWriterImpl.write(DataWriterImpl.java:220)
at org.apache.cxf.interceptor.AbstractOutDatabindingInterceptor.writeParts(AbstractOutDatabindingInterceptor.java:117)
at org.apache.cxf.wsdl.interceptors.BareOutInterceptor.handleMessage(BareOutInterceptor.java:68)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308)
...
我尝试使用 headers,例如 operationName
或 method
等,但我无法让它工作...
有人知道我如何让它工作吗?
非常感谢!
我终于找到了解决问题的方法!...
在我的情况下,operationName
还不够,我还需要添加 operationNamespace = "http://service.company.fr"
!
我正在开发一个使用 CXF 调用服务的 Camel 项目。 这些服务是通过 wsdl 定义的,我无法修改它。 我用wsdl2java生成了类:我会有很多其他的远程服务,它们可能经常变化,所以我希望尽可能多地生成POJO和接口。
我生成的界面是这样的:
@WebService(targetNamespace = "http://service.company.fr", name = "myService")
@XmlSeeAlso({ObjectFactory.class})
public interface MyService {
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
@WebResult(name = "sendMessageResponse", targetNamespace = "http://service.company.fr", partName = "parameters")
@WebMethod
SendMessageResponse sendLetter(
@WebParam(partName = "parameters", name = "sendLetter", targetNamespace = "http://service.company.fr")
SendLetter parameters
) throws MessageServiceException_Exception;
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
@WebResult(name = "sendMessageResponse", targetNamespace = "http://service.company.fr", partName = "parameters")
@WebMethod
SendMessageResponse sendWebNotification(
@WebParam(partName = "parameters", name = "sendWebNotification", targetNamespace = "http://service.company.fr")
SendWebNotification parameters
) throws MessageServiceException_Exception;
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
@WebResult(name = "sendMessageResponse", targetNamespace = "http://service.company.fr", partName = "parameters")
@WebMethod
SendMessageResponse sendEmail(
@WebParam(partName = "parameters", name = "sendEmail", targetNamespace = "http://service.company.fr")
SendEmail parameters
) throws MessageServiceException_Exception;
}
我在 XML 文件中定义了 CXF 端点,如下所示:
<cxf:cxfEndpoint id="serviceEndpoint"
address="http://localhost:9081/soap/service"
serviceClass="fr.company.service.MyService">
<cxf:properties>
<entry key="dataFormat" value="POJO"/>
</cxf:properties>
</cxf:cxfEndpoint>
最后,我在 Camel 路由中调用该服务:
from(URI_SERVICE)
.process(sendEmailBodyProcessor)
.to("cxf:bean:serviceEndpoint");
sendEmailBodyProcessor
设置 body 与 SendEmail object (对应于接口的第 3 个服务)。如果我只留下我在界面中使用的服务,它可以工作,但如果我离开其他服务,我会得到这个错误:
java.lang.IllegalArgumentException: Part {http://service.company.fr}parameters should be of type fr.company.service.SendLetter, not fr.company.service.SendEmail
at org.apache.cxf.jaxb.io.DataWriterImpl.checkPart(DataWriterImpl.java:292)
at org.apache.cxf.jaxb.io.DataWriterImpl.write(DataWriterImpl.java:220)
at org.apache.cxf.interceptor.AbstractOutDatabindingInterceptor.writeParts(AbstractOutDatabindingInterceptor.java:117)
at org.apache.cxf.wsdl.interceptors.BareOutInterceptor.handleMessage(BareOutInterceptor.java:68)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308)
...
我尝试使用 headers,例如 operationName
或 method
等,但我无法让它工作...
有人知道我如何让它工作吗?
非常感谢!
我终于找到了解决问题的方法!...
在我的情况下,operationName
还不够,我还需要添加 operationNamespace = "http://service.company.fr"
!