UnMarshalling не работает должным образом после Java 1.8.0_40 - PullRequest
0 голосов
/ 20 июня 2019

Мы пытаемся разобрать XML для объекта. XML приходит в виде ответа SOAP следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="http://www.myorg.com/Services/1.1">
   <s:Body>
      <s:Fault>
         <s:faultcode>s:Client.TokenRefreshRequired</s:faultcode>
         <s:faultstring>TokenRefreshRequired</s:faultstring>
         <s:detail>
            <ns:refreshTokenResult>
               <ns:authToken>refreshed-access-token1</ns:authToken>
               <ns:privateKey>refreshed-refresh-token1</ns:privateKey>
            </ns:refreshTokenResult>
         </s:detail>
      </s:Fault>
   </s:Body>
</s:Envelope>

Определение класса выглядит следующим образом:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "Fault", namespace = "http://schemas.xmlsoap.org/soap/envelope/")
public class LegacyResponse {

    @XmlElement(name = "faultcode")
    private String faultCode;

    @XmlElement(name = "faultstring")
    private String faultstring;

    @XmlElement(name = "detail")
    private Detail detail;

    public LegacyResponse() {
    }

    // For testing needs
    public LegacyResponse(String faultCode, String faultstring, String token, String privateKey) {
        this.faultCode = faultCode;
        this.faultstring = faultstring;
        this.detail = new Detail(token, privateKey);
    }

    public Detail getDetail() {
        return detail;
    }

    public String getFaultCode() {
        return faultCode;
    }

    public String getFaultstring() {
        return faultstring;
    }

    @Override
    public String toString() {
        final StringBuilder sb = new StringBuilder("LegacyResponse{");
        sb.append("faultCode='").append(faultCode).append('\'');
        sb.append(", faultstring='").append(faultstring).append('\'');
        sb.append(", detail=").append(detail);
        sb.append('}');
        return sb.toString();
    }

    public static class Detail {

        @XmlElement(name = "refreshTokenResult", namespace = "http://www.myorg.com/Services/1.1")
        private RefreshTokenResult refreshTokenResult;

        /**
         * This is a wrapper for the detail object, used only for a special case
         */
        @XmlElement(name = "customFaultDetail", namespace = "http://www.myorg.com/Services/1.1")
        private Detail customDetail;

        public Detail() {
        }

        // For testing needs
        public Detail(String authToken, String privateKey) {
            this.refreshTokenResult = new RefreshTokenResult(authToken, privateKey);
        }

        public RefreshTokenResult getRefreshTokenResult() {
            return refreshTokenResult;
        }

        public Detail getCustomDetail() {
            return customDetail;
        }

        @Override
        public String toString() {
            final StringBuilder sb = new StringBuilder("Detail{");
            sb.append("refreshTokenResult=").append(refreshTokenResult);
            sb.append('}');
            return sb.toString();
        }
    }
}

Это работает нормально до Java 1.8.0_40, но, кроме того, кажется, что демаршаллинг не работает. Все значения в объекте LegacyResponse равны нулю. Любая помощь будет оценена. В журналах распечатывается следующее:

LegacyResponse{faultCode='null', faultstring='null', detail=null} 
...