question-mark
Stuck on an issue?

Lightrun Answers was designed to reduce the constant googling that comes with debugging 3rd party libraries. It collects links to all the places you might be looking at while hunting down a tough bug.

And, if you’re still stuck at the end, we’re happy to hop on a call to see how we can help out.

Deserialization issue from XML to POJO with Jackson: no String-argument constructor/factory method to deserialize from String value

See original GitHub issue

I’ve got an XML document which I need to convert (deserialize) into Java POJO. I use Java 8, and Jackson framework for mapping. Gradle dependencies:

dependencies {
    compile('com.fasterxml.jackson.dataformat:jackson-dataformat-xml')
    compile('org.springframework.boot:spring-boot-starter-freemarker')
    compile('org.springframework.boot:spring-boot-starter-web')
    providedRuntime('org.springframework.boot:spring-boot-starter-tomcat')
    testCompile('org.springframework.boot:spring-boot-starter-test')
}

Wrapper XML Doc:

@JacksonXmlRootElement(localName = "rates_response")
public class RatesResponse implements Serializable{
    private static final long serialVersionUID = 3254688495454519L;

    @JacksonXmlProperty(isAttribute = true)
    private String b_number = "";

    @JacksonXmlProperty(isAttribute = true)
    private String l_premium = "";

    @JacksonXmlProperty(isAttribute = true)
    private String currency = "";

    @XmlElement(required = false)
    @JacksonXmlProperty
    private String c_b_relationship = null;

    @JacksonXmlProperty(isAttribute = true)
    private String n_of_p_loans = null;

    /*
     * Key: status_code
     * Key: status_explanation
     */
    @JacksonXmlElementWrapper
    private Map<String, String> message_status = null;

   // @XmlElement
    @JacksonXmlElementWrapper(useWrapping = false)
    private List<RateDetails> rate_details = null;

    public RatesResponse(){}
     //GETTERS/SETTERS

Child document (List<RateDetails> rate_details = null;):

@JacksonXmlRootElement(localName = "rate_details")
public class RateDetails implements Serializable {
    private static final long serialVersionUID = 324564684815158619L;

    @JacksonXmlProperty
    private String r_reference = null;
    @JacksonXmlProperty
    private String n_of_p_days = null;
    @JacksonXmlProperty
    private String n_of_instalments = null;
    @JacksonXmlProperty
    private String n_rate = null;
    @JacksonXmlProperty
    private String p_p_available = null;

    @XmlElement(required = false)
    @JacksonXmlProperty
    private String i_overrider = null;//not always appears in doc
    @JacksonXmlProperty
    private String a_fee = null;
    @JacksonXmlProperty
    private String m_fee = null;
    @JacksonXmlProperty
    private String t_fees = null;
    @JacksonXmlProperty
    private String t_c_for_credit = null;
    @JacksonXmlProperty
    private String d_amount = null;
    @JacksonXmlProperty
    private String apr = null;

    public RateDetails(){}
    //GETTERS/SETTERS

XML document to parse:

<?xml version="1.0"?>
<!DOCTYPE rates_response SYSTEM "p_f_interface.dtd">
<rates_response b_number="KK5000000000" l_premium="5000.00" currency="GBP" >
    <message_status>
        <status_code>1000</status_code>
        <status_explanation>Success</status_explanation>
    </message_status>
    <c_b_relationship n_of_p_loans="0"/>
    <rate_details>
        <r_reference>AS28</r_reference>
        <n_of_p_days>28</n_of_p_days>
        <n_of_instalments>12</n_of_instalments>
        <n_rate>7.00</n_rate>
        <p_p_available>NO</p_p_available>
        <i_overrider>3.65</i_overrider>
        <a_fee>0.00</a_fee>
        <m_fee>0.00</m_fee>
        <t_fees>0.00</t_fees>
        <t_c_for_credit>350.00</t_c_for_credit>
        <d_amount>0.00</d_amount>
        <apr>16.05</apr>
    </rate_details>    
</rates_response>

The method which parses the doc:

private RatesResponse readRatesDoc() {
    RatesResponse xmlContainer = null;

    ObjectMapper xmlMapper = new XmlMapper();
    try {
        xmlContainer = xmlMapper.readValue(contrUtil.readXmlFile("Rates_Response.xml"), RatesResponse.class);
    } catch (IOException e) {
        log.log(Level.SEVERE, "An Exception on parsing XML document", e);
    }
    return xmlContainer;
}

The exception:

com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of premium.finance.beanResponse.rates.RateDetails: no String-argument constructor/factory method to deserialize from String value ('16.05')
 at [Source: java.io.StringReader@7bd22d0b; line: 1, column: 945] (through reference chain: premium.finance.beanResponse.rates.RatesResponse["rate_details"]->java.util.ArrayList[1])
    at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:261) ~[jackson-databind-2.8.3.jar:2.8.3]
    at com.fasterxml.jackson.databind.DeserializationContext.instantiationException(DeserializationContext.java:1456) ~[jackson-databind-2.8.3.jar:2.8.3]
    at com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1012) ~[jackson-databind-2.8.3.jar:2.8.3]
    at com.fasterxml.jackson.databind.deser.ValueInstantiator._createFromStringFallbacks(ValueInstantiator.java:366) ~[jackson-databind-2.8.3.jar:2.8.3]
    at com.fasterxml.jackson.databind.deser.std.StdValueInstantiator.createFromString(StdValueInstantiator.java:307) ~[jackson-databind-2.8.3.jar:2.8.3]
    at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromString(BeanDeserializerBase.java:1278) ~[jackson-databind-2.8.3.jar:2.8.3]
    at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:159) ~[jackson-databind-2.8.3.jar:2.8.3]
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:150) ~[jackson-databind-2.8.3.jar:2.8.3]
    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:277) ~[jackson-databind-2.8.3.jar:2.8.3]
    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:249) ~[jackson-databind-2.8.3.jar:2.8.3]
    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:26) ~[jackson-databind-2.8.3.jar:2.8.3]
    at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:499) ~[jackson-databind-2.8.3.jar:2.8.3]
    at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:101) ~[jackson-databind-2.8.3.jar:2.8.3]
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:276) ~[jackson-databind-2.8.3.jar:2.8.3]
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:140) ~[jackson-databind-2.8.3.jar:2.8.3]
    at com.fasterxml.jackson.dataformat.xml.deser.WrapperHandlingDeserializer.deserialize(WrapperHandlingDeserializer.java:120) ~[jackson-dataformat-xml-2.8.3.jar:2.8.3]
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3789) ~[jackson-databind-2.8.3.jar:2.8.3]
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2833) ~[jackson-databind-2.8.3.jar:2.8.3]
    at premium.finance.controller.IndexController.readRatesDoc(IndexController.java:190) [main/:na]
    at premium.finance.controller.IndexController.requestIndex(IndexController.java:69) [main/:na]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_91]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_91]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_91]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_91]
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221) [spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE]
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136) [spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:114) [spring-webmvc-4.3.3.RELEASE.jar:4.3.3.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827) [spring-webmvc-4.3.3.RELEASE.jar:4.3.3.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738) [spring-webmvc-4.3.3.RELEASE.jar:4.3.3.RELEASE]
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) [spring-webmvc-4.3.3.RELEASE.jar:4.3.3.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963) [spring-webmvc-4.3.3.RELEASE.jar:4.3.3.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897) [spring-webmvc-4.3.3.RELEASE.jar:4.3.3.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) [spring-webmvc-4.3.3.RELEASE.jar:4.3.3.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861) [spring-webmvc-4.3.3.RELEASE.jar:4.3.3.RELEASE]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:622) [tomcat-embed-core-8.5.5.jar:8.5.5]
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) [spring-webmvc-4.3.3.RELEASE.jar:4.3.3.RELEASE]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) [tomcat-embed-core-8.5.5.jar:8.5.5]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230) [tomcat-embed-core-8.5.5.jar:8.5.5]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) [tomcat-embed-core-8.5.5.jar:8.5.5]
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) [tomcat-embed-websocket-8.5.5.jar:8.5.5]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) [tomcat-embed-core-8.5.5.jar:8.5.5]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) [tomcat-embed-core-8.5.5.jar:8.5.5]
    at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) [spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) [tomcat-embed-core-8.5.5.jar:8.5.5]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) [tomcat-embed-core-8.5.5.jar:8.5.5]
    at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:89) [spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) [tomcat-embed-core-8.5.5.jar:8.5.5]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) [tomcat-embed-core-8.5.5.jar:8.5.5]
    at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77) [spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) [tomcat-embed-core-8.5.5.jar:8.5.5]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) [tomcat-embed-core-8.5.5.jar:8.5.5]
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197) [spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) [tomcat-embed-core-8.5.5.jar:8.5.5]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) [tomcat-embed-core-8.5.5.jar:8.5.5]
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198) [tomcat-embed-core-8.5.5.jar:8.5.5]
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:108) [tomcat-embed-core-8.5.5.jar:8.5.5]
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) [tomcat-embed-core-8.5.5.jar:8.5.5]
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) [tomcat-embed-core-8.5.5.jar:8.5.5]
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) [tomcat-embed-core-8.5.5.jar:8.5.5]
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) [tomcat-embed-core-8.5.5.jar:8.5.5]
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:349) [tomcat-embed-core-8.5.5.jar:8.5.5]
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:784) [tomcat-embed-core-8.5.5.jar:8.5.5]
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-embed-core-8.5.5.jar:8.5.5]
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:802) [tomcat-embed-core-8.5.5.jar:8.5.5]
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1410) [tomcat-embed-core-8.5.5.jar:8.5.5]
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-8.5.5.jar:8.5.5]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_91]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_91]
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-8.5.5.jar:8.5.5]
    at java.lang.Thread.run(Thread.java:745) [na:1.8.0_91]

The top line says:

no String-argument constructor/factory method to deserialize from String value ('16.05')

The value it is referring to comes from under this tag: <apr>16.05</apr>

If I displace (move around) the tag, <apr>16.05</apr>, the parser works and no exception gets caused. If I replace the tag by different tag, the same exception still occurs; it affects only the last tag within the <rate_details> wrapper tag, for some reasons.

Issue Analytics

  • State:closed
  • Created 7 years ago
  • Reactions:3
  • Comments:30 (9 by maintainers)

github_iconTop GitHub Comments

44reactions
tomcaladocommented, Mar 13, 2017

I have the same problem. For me, it works using the follow code:

JacksonXmlModule module = new JacksonXmlModule(); module.setDefaultUseWrapper(false); XmlMapper xmlMapper = new XmlMapper(module);

instead of your line that is:

ObjectMapper xmlMapper = new XmlMapper();

3reactions
Pytrycommented, Nov 15, 2019

I came across this error, but for me it wasn’t a bug; it was a bad DTO.

Simplified xml example

<line>
    <code type="ABC">qsd</code>
    <amount>138</amount>
</line>

Simplified DTO Example

@JacksonXmlRootElement(localName="line")
public class Line{
    @JacksonXmlProperty(localName="code")
    private String code; //This should have been a complex type!
    @JacksonXmlProperty(localName="amount")
    private String amount;
    // getters and setters
}

The error message in this case was confusing because it made me think the problem was with <amount>, when it was actually for <code>.

Read more comments on GitHub >

github_iconTop Results From Across the Web

java 8 - Deserialization issue from XML to POJO with Jackson
Deserialization issue from XML to POJO with Jackson: no String-argument constructor/factory method to deserialize from String value · Ask ...
Read more >
Jackson: java.util.LinkedHashMap cannot be cast to X
ClassCastException: java.util.LinkedHashMap cannot be cast to X when we try to deserialize JSON or XML into a collection of objects.
Read more >
Jackson Commonly used Configuration Examples - LogicBig
MyObject` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('')
Read more >
Uses of Class com.fasterxml.jackson.databind ...
Method called to find value identified by id valueId to inject as value of specified property during deserialization, passing POJO instance in which...
Read more >
code generation error - SmartBear Community
Exception in thread "main" com.fasterxml.jackson.databind.exc. ... exist): no String-argument constructor/factory method to deserialize from ...
Read more >

github_iconTop Related Medium Post

No results found

github_iconTop Related StackOverflow Question

No results found

github_iconTroubleshoot Live Code

Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start Free

github_iconTop Related Reddit Thread

No results found

github_iconTop Related Hackernoon Post

No results found

github_iconTop Related Tweet

No results found

github_iconTop Related Dev.to Post

No results found

github_iconTop Related Hashnode Post

No results found