History | Log In     View a printable version of the current page.  
Issue Details (XML | Word | Printable)

Key: XFIRE-318
Type: Bug Bug
Status: Closed Closed
Resolution: Fixed
Priority: Minor Minor
Assignee: Dan Diephouse
Reporter: Karthikeyan M.
Votes: 0
Watchers: 1
Operations

If you were logged in you would be able to see more operations.
XFire

Invalid exception on empty element

Created: 27/Mar/06 12:45 AM   Updated: 29/Mar/06 09:46 AM
Component/s: Core
Affects Version/s: 1.0
Fix Version/s: 1.1-beta-1

Time Tracking:
Issue & Sub-Tasks
Issue Only
Not Specified

Environment: Win XP, Java 1.5

Sub-Tasks  All   Open   

 Description  « Hide
There seems to be an issue with AbstractMessageReader.getValueAsXXX() methods when there is an empty element in the request. I am using 1.0 verion of xfire.

If I have a class like the following is passed to a service method as an input parameter

public class A
{
private Long ID;
private Date createdDate;
private String name;
//getter and setter
}

Whose schema in wsdl looks like:
<xsd:complexType name="A">
<xsd:sequence>
<xsd:element minOccurs="0" name="ID" nillable="true" type="xsd:long"/> <xsd:element minOccurs="0" name="createdDate" type="xsd:dateTime"/> <xsd:element minOccurs="0" name="name" nillable="true" type="xsd:string"/> </xsd:sequence>
</xsd:complexType>
and created a request (using a php client) that could look like

<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ns1="http://mycompany.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<SOAP-ENV:Body>
<ns1:serviceMethod>
<ns1:A>
<ns1:ID/>
<ns1:createdDate>2006-07-01T00:00:00</ns1:createdDate>
<ns1:name>Chicago Cars</ns1:name>
</ns1:A>
</ns1:addCampaign>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

I get an exception:

org.codehaus.xfire.fault.XFireFault: Illegal argument. For input string: "2006-07-01T00:00:00"
at org.codehaus.xfire.aegis.type.basic.BeanType.readObject(BeanType.java:155)
at org.codehaus.xfire.aegis.AegisBindingProvider.readParameter(AegisBindingProvider.java:91)
at org.codehaus.xfire.service.binding.AbstractBinding.read(AbstractBinding.java:175)
at org.codehaus.xfire.service.binding.WrappedBinding.readMessage(WrappedBinding.java:50)
at org.codehaus.xfire.soap.handler.SoapBodyHandler.invoke(SoapBodyHandler.java:42)
at org.codehaus.xfire.handler.HandlerPipeline.invoke(HandlerPipeline.java:98)
at org.codehaus.xfire.transport.DefaultEndpoint.onReceive(DefaultEndpoint.java:58)
at org.codehaus.xfire.transport.AbstractChannel.receive(AbstractChannel.java:38)
at org.codehaus.xfire.transport.http.XFireServletController.invoke(XFireServletController.java:276)
at org.codehaus.xfire.transport.http.XFireServletController.doService(XFireServletController.java:145)
at org.codehaus.xfire.transport.http.XFireServlet.doPost(XFireServlet.java:100)
at com.mycompany.sm.ws.servlet.MasterXFireServlet.doPost(MasterXFireServlet.java:61)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:868)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:663)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Thread.java:595)
Caused by: java.lang.NumberFormatException: For input string: "2006-07-01T00:00:00"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
at java.lang.Long.parseLong(Long.java:412)
at java.lang.Long.parseLong(Long.java:461)
at org.codehaus.xfire.aegis.AbstractMessageReader.getValueAsLong(AbstractMessageReader.java:70)
at org.codehaus.xfire.aegis.type.basic.LongType.readObject(LongType.java:28)
at org.codehaus.xfire.aegis.type.basic.BeanType.readObject(BeanType.java:111)

I would expect either the request to go through or a NumberFormatException because of an empty string. The issue seems to be with AbstractMessageReader.getValueAsXXX() methods.
public long getValueAsLong()

{ if (getValue() == null) return 0l; return Long.parseLong( *getValue()* ); }

The second getValue() is getting the value of the next element in the request, in this case the value of the element createdDate.

The simple fix I can think of is to call getValue() once and use the text.

It would also be more practical and helpful (especially with interop clients) to return null instead of NumberFormatException for empty strings. I am not sure if this would violate any specs requirements.



 All   Comments   Work Log   Change History      Sort Order: Ascending order - Click to sort in descending order
Dan Diephouse - 29/Mar/06 09:46 AM
Fixed in SVN now. Thanks.