nillable="true" results in IllegalStateException: Current state not
START_ELEMENT
---------------------------------------------------------------------------------
Key: JIBX-218
URL: http://jira.codehaus.org/browse/JIBX-218
Project: JiBX
Issue Type: Bug
Affects Versions: JiBX 1.1.5
Reporter: Michael Bannij
Fix For: JiBX 1.1.6
I have a problem with jibx databinding in webservises built with Axis2.
My part built with the mentioned frameworks is contacting remote implementation
of webservices. Remote webservises are built with very different frameworks and
are working without any problems. They responce on my webservice request with
XML like shown below (i've renamed namespaces and stripped lots of unimportant
fields):
---8<--------------------
<ns2:AResponse
xmlns="http://www.my.com/common"
xmlns:ns2="http://www.my.com/request"
xmlns:ns6="http://www.my.com/response"
<ns6:ResponseState>
<ErrorCode>0</ErrorCode>
<StrErrorCode
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
<Message>Success</Message>
<NativeError
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
<LogSequence
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
</ns6:ResponseState>
</ns2:AResponse>
-------------------->8---
The appropirate part of XSD from appropriate webservice definition should look
like:
---8<--------------------
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema
targetNamespace="http://www.my.com/common"
xmlns="http://www.my.com/common"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
...
<xsd:complexType name="ResponseStateType">
<xsd:sequence>
<xsd:element name="ErrorCode" type="xsd:int" minOccurs="1"
nillable="false" />
<xsd:element name="StrErrorCode" type="xsd:string" minOccurs="0"
nillable="true" />
<xsd:element name="Message" type="xsd:string" minOccurs="1"
nillable="false" />
<xsd:element name="NativeError" type="xsd:string" minOccurs="0"
nillable="true" />
<xsd:element name="LogSequence" type="xsd:long" minOccurs="0"
nillable="true" />
</xsd:sequence>
</xsd:complexType>
...
</xsd:schema>
-------------------->8---
And my binding.xml then looks like (a bit complicated due to original
namespaces hierarhy):
---8<--------------------
<mapping
name="AResponse"
class="com.my.FileInfoSearchResult"
extends="com.my.PageableSearchResult">
<namespace uri="http://www.my.com/request" default="elements" />
<structure map-as="com.my.PageableSearchResult" />
</mapping>
<mapping abstract="true" class="com.my.PageableSearchResult">
<namespace prefix="lr" uri="http://www.my.com/response" default="elements"/>
<structure name="ResponseState" field="responseState" usage="required"
type="com.my.ResponseStateType"/>
</mapping>
<mapping abstract="true" class="com.my.ResponseStateType">
<namespace prefix="respst" uri="http://www.my.com/common"
default="elements"/>
<value name="ErrorCode" field="errorCode" usage="required"/>
<value name="StrErrorCode" field="strErrorCode" nillable="true"
usage="optional"/>
<value name="Message" field="message" usage="required"/>
<value name="NativeError" field="nativeError" nillable="true"
usage="optional"/>
<value name="LogSequence" field="logSequence" nillable="true"
usage="optional"/>
</mapping>
-------------------->8---
The problem is in the fact that unmarshaling of the webservces response on my
side fails. The original exception is:
---8<--------------------
"IllegalStateException: Current state not START_ELEMENT"
-------------------->8---
Then the exception is wrapped into AxisFault when being thown out.
The IllegalStateException is thrown from the place shown in this stacktrace
(stopped on "IllegalStateException trow" breakpoint):
---8<--------------------
Thread [btpool0-6] (Suspended (exception IllegalStateException))
ValidatingStreamReader(BasicStreamReader).getAttributeValue(String,
String) line: 641
OMStAXWrapper.getAttributeValue(String, String) line: 656
StAXReaderWrapper.getAttributeValue(String, String) line: 378
UnmarshallingContext.getAttributeValue(String, String) line: 356
UnmarshallingContext.attributeBoolean(String, String, boolean) line:
1881
ResponseStateType.JiBX_binding_unmarshal_1_0(UnmarshallingContext)
line: not available
ResponseStateType.JiBX_binding_unmarshal_1_1(UnmarshallingContext)
line: not available
FileInfoSearchResult(PageableSearchResult).JiBX_binding_unmarshal_1_1(UnmarshallingContext)
line: not available
FileInfoSearchResult.JiBX_binding_unmarshal_2_0(UnmarshallingContext)
line: not available
JiBX_bindingFileInfoSearchResult_access2.unmarshal(Object,
IUnmarshallingContext) line: not available
UnmarshallingContext.unmarshalElement(Class) line: 2512
FileInfoWServiceStub.fromOM(OMElement, Class, Map) line: 370
FileInfoWServiceStub.getFileInfo(FindFileInfo, HeaderType) line: 221
TransactionsWsClient.getFileInfoList(FindFileInfo) line: 278
FileinfoMBean.doSearch() line: 31
FileinfoMBean.initListener(ActionEvent) line: 35
NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not
available [native method]
NativeMethodAccessorImpl.invoke(Object, Object[]) line: 39
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25
Method.invoke(Object, Object...) line: 585
AstValue.invoke(EvaluationContext, Class[], Object[]) line: 187
MethodExpressionImpl.invoke(ELContext, Object[]) line: 297
TagMethodExpression.invoke(ELContext, Object[]) line: 68
LegacyMethodBinding.invoke(FacesContext, Object[]) line: 69
HtmlCommandLink(UICommand).broadcast(FacesEvent) line: 89
UIViewRoot._broadcastForPhase(PhaseId) line: 97
UIViewRoot.processApplication(FacesContext) line: 171
InvokeApplicationExecutor.execute(FacesContext) line: 32
LifecycleImpl.executePhase(FacesContext, PhaseExecutor,
PhaseListenerManager) line: 95
LifecycleImpl.execute(FacesContext) line: 70
FacesServlet.service(ServletRequest, ServletResponse) line: 139
...
-------------------->8---
According to stack variables (reader buffer and pointer) the element being
processed (and that is causing this error) is:
---8<--------------------
<StrErrorCode xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:nil="true"/>
-------------------->8---
Must note that the bug looks like JIBX-198, but is being trown in some other
place.
The exception it thrown from BasicStreamReader.getAttributeValue():
---8<--------------------
public String getAttributeValue(String nsURI, String localName) {
if (mCurrToken != START_ELEMENT) {
throw new IllegalStateException(ErrorConsts.ERR_STATE_NOT_STELEM);
// THROWNHERE
}
return mAttrCollector.getValue(nsURI, localName);
}
-------------------->8---
An must note that value of mCurrToken is END_ELEMENT. I think that the code
looking for value of "nil" is confused by the fact that the element being
processed (and containing nil="true") is at the same time both START_ELEMENT
and END_ELEMENT).
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://jira.codehaus.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
jibx-devs mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/jibx-devs