Hi,
This issue get fixed, [1] is the jira to track it.
Please grab the latest 3.2.2 snapshot code and try agian.
[1]https://issues.apache.org/activemq/browse/SM-1328
Regards
Freeman
Freeman Fang wrote:
Hi,
Quick update of this issue
I reproduce the your problem and finally found the root cause,
Your schema is unqualified which confuse the unmarshelling of the JBI
fault, the work around is add
elementFormDefault="qualified" attribute to your schema, then
everything should be fine.
Anyway, we should provide a way to enable unqualified fault for cxf bc
provider, I'm still looking for how to fix it.
Regards
Freeman
k_seb wrote:
Hi!
Thank you for your fast response. After changing locationURI I have
still problem with empty fault part. I use the latest SNAPSHOT of
service-mix (3.2.2) and cxf wsdl2java (2.0.6-incubator-SNAPSHOT)
Below I enclose the wsdl file:
<?xml version="1.0" encoding="UTF-8"?>
<definitions name='BusyService'
targetNamespace='http://busy-service.pl/busy/ws'
xmlns='http://schemas.xmlsoap.org/wsdl/'
xmlns:soap='http://schemas.xmlsoap.org/wsdl/soap/'
xmlns:tns='http://busy-service.pl/busy/ws'
xmlns:xsd='http://www.w3.org/2001/XMLSchema'>
<types>
<xs:schema targetNamespace='http://busy-service.pl/busy/ws'
version='1.0' xmlns:tns='http://busy-service.pl/busy/ws'
xmlns:xs='http://www.w3.org/2001/XMLSchema'>
<xs:element name='BusyServiceFault' type='tns:BusyServiceFault'/>
<xs:element name='addBusyPeriod' type='tns:addBusyPeriod'/>
<xs:element name='addBusyPeriodResponse'
type='tns:addBusyPeriodResponse'/>
<xs:complexType name='addBusyPeriod'>
<xs:sequence>
<xs:element minOccurs='0' name='number' type='xs:string'/>
</xs:sequence>
</xs:complexType>
<xs:complexType name='addBusyPeriodResponse'>
<xs:sequence>
<xs:element minOccurs='0' name='return' type='xs:int'/>
</xs:sequence>
</xs:complexType>
<xs:complexType name='BusyServiceFault'>
<xs:sequence>
<xs:element name='errorDesc' type='xs:string'/>
</xs:sequence>
</xs:complexType>
</xs:schema>
</types>
<message name='BusyService_addBusyPeriod'>
<part element='tns:addBusyPeriod' name='addBusyPeriod'/>
</message>
<message name='BusyService_addBusyPeriodResponse'>
<part element='tns:addBusyPeriodResponse'
name='addBusyPeriodResponse'/>
</message>
<message name='BusyServiceFault'>
<part element='tns:BusyServiceFault' name='BusyServiceFault'/>
</message>
<portType name='BusyService'>
<operation name='addBusyPeriod' parameterOrder='addBusyPeriod'>
<input message='tns:BusyService_addBusyPeriod'/>
<output message='tns:BusyService_addBusyPeriodResponse'/>
<fault message='tns:BusyServiceFault' name='BusyServiceFault'/>
</operation>
</portType>
<binding name='BusyServiceBinding' type='tns:BusyService'>
<soap:binding style='document'
transport='http://schemas.xmlsoap.org/soap/http'/>
<operation name='addBusyPeriod'>
<soap:operation soapAction=''/>
<input>
<soap:body use='literal'/>
</input>
<output>
<soap:body use='literal'/>
</output>
<fault name='BusyServiceFault'>
<soap:fault name='BusyServiceFault' use='literal'/>
</fault>
</operation>
</binding>
<service name='BusyService'>
<port binding='tns:BusyServiceBinding' name='BusyServicePort'>
<soap:address location='http://localhost:9001/busy-service'/>
</port>
</service>
<service name='BusyServiceProxy'>
<port binding='tns:BusyServiceBinding' name='BusyServiceProxyPort'>
<soap:address location='http://external.host'/>
</port>
</service>
</definitions>
Generated BusyServiceFault by CXF wsdl2java is:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "BusyServiceFault", propOrder = {
"errorDesc"
})
public class BusyServiceFault {
@XmlElement(required = true)
protected String errorDesc;
/**
* Gets the value of the errorDesc property.
* * @return
* possible object is
* [EMAIL PROTECTED] String }
* */
public String getErrorDesc() {
return errorDesc;
}
/**
* Sets the value of the message property.
* * @param value
* allowed object is
* [EMAIL PROTECTED] String }
* */
public void setErrorDesc(String value) {
this.errorDesc = value;
}
}
And InOut message with right content of errorDesc which is received
from external part:
DEBUG - SedaQueue -
[EMAIL PROTECTED] dequeued
exchange: InOut[
id: ID:172.17.39.124-119751f9c34-5:1
status: Active
role: consumer
interface: {http://busy-service.pl/busy/ws}BusyService
service: {http://busy-service.pl/busy/ws}BusyServiceProxy
endpoint: BusyServiceProxyPort
operation: {http://busy-service.pl/busy/ws}addBusyPeriod
in: <?xml version="1.0" encoding="UTF-8"?><jbi:message
xmlns:jbi="http://java.sun.com/xml/ns/jbi/wsdl-11-wrapper"
xmlns:msg="http://busy-service.pl/busy/ws"
type="msg:addBusyPeriod"><jbi:part><ns2:addBusyPeriod
xmlns:ns2="http://busy-service.pl/busy/ws"><number>12123123123</number></ns2:addBusyPeriod></jbi:part></jbi:message>
fault: <?xml version="1.0" encoding="UTF-8"?><JBIFault
xmlns="http://cxf.apache.org/bindings/jbi"><ns2:BusyServiceFault
xmlns:ns2="http://busy-service.pl/busy/ws"><errorDesc>Defined busy
period should be independent of other date
regions.</errorDesc></ns2:BusyServiceFault></JBIFault>]
DEBUG - DeliveryChannelImpl - Notifying exchange
ID:172.17.39.124-119751f9c34-5:1(10c03c6) in DeliveryChannel{servicemi
x-cxf-se} from processInboundSynchronousExchange
DEBUG - DeliveryChannelImpl - Notified:
ID:172.17.39.124-119751f9c34-5:1(10c03c6) in
DeliveryChannel{servicemix-cxf-se}
from sendSync
Hi Sebastian,
What's the servicemix version you are using? Would you please try
with the 3.2.2 snapshot?
And please change the locationURI for your provider configuration
locationURI="http://10.11.10.10:8080/BusyServiceWSImpl" (no need
?wsdl)
If you still have problem. if possible could you append your whole
test case, especially the wsdl you are using, I'd like to see the
fault in your wsdl
Actually we have a test very similar with your scenario, and the
exception handle part is always ok, please see [1],
the
//test exception handle
part
[1]http://svn.apache.org/repos/asf/servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-cxf-bc/src/test/java/org/apache/servicemix/cxfbc/CxfBcProviderTest.java
Regards
Freeman
Sebastian Kuligowski wrote:
Hello,
I've created proxy scenario using cxf-bc and cxf-se components using
CXF-BC (1) --- CXF-SE bean (2) with injected provider --- CXF-BC
(3) to external
endpoint (as described in all tutorials)
The problem:
After receiving fault from external endpoint (3) with a parameter
('errorDesc') included which describes bussiness cause of the
fault, that parameter
is empty/null after catching exception in my proxy bean.
In logs I could find that the falut is wrapped properly in JBIFalut
object after receiving soap fault from external endpoint: errorDesc
parameter is set with proper message.
fault: <?xml version="1.0" encoding="UTF-8"?><JBIFault
xmlns="http://cxf.apache.org/bindings/jbi"><ns2:BusyServiceFault
xmlns:ns2="http://busy-service.pl/busy/ws"><errorDesc>Defined busy
period should be independent of other date
regions.</errorDesc></ns2:BusyServiceFault></JBIFault>
<JBIFault
xmlns="http://cxf.apache.org/bindings/jbi"><CalculatorFault
xmlns="http://apache.org/cxf/calculator/types"><faultInfo>Numbers:
1, -1</faultInfo><message>Negative number cant be
added!</message></CalculatorFault></JBIFault>
But not in catched exception below. My bean with proxied
busyService provider:
public class BusyServiceESBImpl implements BusyService {
private BusyService busyService; // injected proxied provider
// exposed by CXF-BC (1)
public Integer addBusyPeriod(String number) throws
BusyServiceFault_Exception {
try {
return getBusyService().addBusyPeriod(number);
// external endpoint returns business exception defined in WSDL
} catch (BusyServiceFault_Exception e) {
System.out.println(e.getFaultInfo().getErrorDesc());
// is NULL!!!!!!!!! errorDesc inside BusyServiceFault object is
lost
System.out.println(e.getMessage()); // returns faultstring
}
}
I would be very grateful for any help, I've spent a lot of time on
searching any solution.
Details:
CXF-BC xbean.xml
<cxfbc:consumer wsdl="classpath:BusyService.wsdl"
targetService="busy-service:BusyService"
targetInterface="busy-service:BusyService"/>
<cxfbc:provider wsdl="classpath:BusyService.wsdl"
locationURI="http://10.11.10.10:8080/BusyServiceWSImpl?wsdl"
service="busy-service:BusyServiceProxy"
endpoint="BusyServiceProxyPort"
interfaceName="busy-service:BusyService" />
CXF-SE xbean.xml
<cxfse:endpoint>
<cxfse:pojo>
<bean class="busy.esb.BusyServiceESBImpl">
<property name="busyService">
<cxfse:proxy service="busy:BusyServiceProxy"
context="#context" type="busy.ws.BusyService" />
</property>
</bean>
</cxfse:pojo>
</cxfse:endpoint>
Best regards
Sebastian Kuligowski