0

I've been trying to unmarshall a xml (as String) to an object but it's returning a NullPointerException error. I'm like a week searching for a solution, but nothing seems to work. I've already modified the "unmarshallpacs008" method and the "SPIEnvelopeMessage" class many times trying other stuffs that i've found over the forums.

While debugging the code, i've seen that the error ocurrs at the "unmarshaller.unmarshal" point, where it returns null for all the 2 elements present at the "SPIEnvelopeMessage" class. They return literally as shown bellow but i've already changed the @XmlElement name and attributes and nothing works.

appHdr = null document = null

The point where the error is thrown is at "message.getDocument()......" bc there's no document, since it's returning null (line 94 from PSPEmissorService)

java.lang.NullPointerException: null
    at com.praxis.spi_simulator.psp_emissor.application.services.PSPEmissorService.sendPaymentsToSpi(PSPEmissorService.java:94) ~[classes/:na]
    at com.praxis.spi_simulator.psp_emissor.application.controller.PSPEmissorController.sendPaymentsToSpiIssuer(PSPEmissorController.java:70) ~[classes/:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
    at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:197) ~[spring-web-5.3.5.jar:5.3.5]
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:141) ~[spring-web-5.3.5.jar:5.3.5]
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.5.jar:5.3.5]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~[spring-webmvc-5.3.5.jar:5.3.5]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.5.jar:5.3.5]
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.5.jar:5.3.5]
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1060) ~[spring-webmvc-5.3.5.jar:5.3.5]
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:962) ~[spring-webmvc-5.3.5.jar:5.3.5]
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.5.jar:5.3.5]
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) ~[spring-webmvc-5.3.5.jar:5.3.5]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:652) ~[tomcat-embed-core-9.0.44.jar:4.0.FR]
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.5.jar:5.3.5]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.44.jar:4.0.FR]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227) ~[tomcat-embed-core-9.0.44.jar:9.0.44]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.44.jar:9.0.44]
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.44.jar:9.0.44]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.44.jar:9.0.44]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.44.jar:9.0.44]
    at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.5.jar:5.3.5]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.5.jar:5.3.5]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.44.jar:9.0.44]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.44.jar:9.0.44]
    at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.5.jar:5.3.5]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.5.jar:5.3.5]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.44.jar:9.0.44]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.44.jar:9.0.44]
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.5.jar:5.3.5]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.5.jar:5.3.5]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.44.jar:9.0.44]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.44.jar:9.0.44]
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~[tomcat-embed-core-9.0.44.jar:9.0.44]
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-9.0.44.jar:9.0.44]
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) ~[tomcat-embed-core-9.0.44.jar:9.0.44]
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) ~[tomcat-embed-core-9.0.44.jar:9.0.44]
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.44.jar:9.0.44]
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-9.0.44.jar:9.0.44]
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357) ~[tomcat-embed-core-9.0.44.jar:9.0.44]
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374) ~[tomcat-embed-core-9.0.44.jar:9.0.44]
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.44.jar:9.0.44]
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:893) ~[tomcat-embed-core-9.0.44.jar:9.0.44]
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1707) ~[tomcat-embed-core-9.0.44.jar:9.0.44]
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.44.jar:9.0.44]
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na]
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na]
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.44.jar:9.0.44]
    at java.base/java.lang.Thread.run(Thread.java:829) ~[na:na]

SPIEnvelopeMessage message = XMLUtil.unmarshallpacs008(xml);
                idLongStr = ("" + idLong).length() < SimulatorConstants.TAMANIO_COMPLEMENTO ? "0" + idLong : "" + idLong;
                message.getDocument().getFIToFICstmrCdtTrf().getGrpHdr().setMsgId(idSufijo + idLongStr);
                message.getAppHdr().setBizMsgIdr(idSufijo + idLongStr);

@XmlRootElement(name = "Envelope")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "SPIEnvelopeMessage", propOrder = {
    "appHdr",
    "document"
})
public class SPIEnvelopeMessage {

    @XmlElement(name = "AppHdr", required = true)
    protected SPIHead00100101 appHdr;
    @XmlElement(name = "Document", required = true)
    protected SPIPacs00800109 document;

    /**
     * Obtiene el valor de la propiedad appHdr.
     * 
     * @return
     *     possible object is
     *     {@link SPIHead00100101 }
     *     
     */
    public SPIHead00100101 getAppHdr() {
        return appHdr;
    }

    /**
     * Define el valor de la propiedad appHdr.
     * 
     * @param value
     *     allowed object is
     *     {@link SPIHead00100101 }
     *     
     */
    public void setAppHdr(SPIHead00100101 value) {
        this.appHdr = value;
    }

    /**
     * Obtiene el valor de la propiedad document.
     * 
     * @return
     *     possible object is
     *     {@link SPIPacs00800109 }
     *     
     */
    public SPIPacs00800109 getDocument() {
        return document;
    }

    /**
     * Define el valor de la propiedad document.
     * 
     * @param value
     *     allowed object is
     *     {@link SPIPacs00800109 }
     *     
     */
    public void setDocument(SPIPacs00800109 value) {
        this.document = value;
    }

}

@SuppressWarnings("unchecked")
    public static SPIEnvelopeMessage unmarshallpacs008(String xml)
            throws JAXBException {
        StringReader sr = new StringReader(xml);
        JAXBContext jc = JAXBContext.newInstance(SPIEnvelopeMessage.class);
        Unmarshaller unmarshaller = jc.createUnmarshaller();
        return (SPIEnvelopeMessage) ((JAXBElement) unmarshaller.unmarshal(sr)).getValue();
    }
  • There's no stacktrace and it might help to set breakpoints in that method; remove `@SuppressWarnings("unchecked")` first. – Martin Zeitler May 09 '22 at 15:22
  • yeah, i've already debugged that method, the xml string is present there, with the 2 fields present too (AppHdr and Document), and about the error, there's nothing different in particular, as you can see bellow. java.lang.NullPointerException: null – Luan Pereira May 09 '22 at 15:25
  • 1
    Please [edit] your question with the full stacktrace and clearly indicate explictly which line causes the error. – Code-Apprentice May 09 '22 at 15:28
  • 1
    Please clarify your specific problem or provide additional details to highlight exactly what you need. As it's currently written, it's hard to tell exactly what you're asking. – Community May 09 '22 at 19:20

1 Answers1

0

To marshal an object, you have to ensure that the object, along with the contents of that object, are serializable.

Try implementing the Serializable interface into your classes:

public SPIEnvelopeMessage implements Serializable {}
Martin Zeitler
  • 1
  • 19
  • 155
  • 216
cjnash
  • 1,228
  • 3
  • 19
  • 37
  • ok, i've tried but nothing differente happened, keeps throwing the NullPointerException: null – Luan Pereira May 09 '22 at 15:29
  • Did you also implement serializable to the subclasses `SPIHead00100101` and `SPIPacs00800109 ` ? Also, in the stacktrace you posted, you say it broke on `message.getDocument()` but I don't see that in the trace. The call to `message.getDocument().getFIToFICstmrCdtTrf().getGrpHdr()` is a long chain that could be null anywhere. Would be useful for you to post the trace that explicitly calls out the `message.getDocument()` call – cjnash May 09 '22 at 15:50