Ошибка Java StackOverflowError при преобразовании объекта в JSON

У меня есть следующий объект Java.

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(
    name = "ApprovalRequest",
    propOrder = {"requiredConclusionTime", "approvalType", "businessRequest", "supportingInfo", "messageToEvaluator", "organisation", "resubmissionOf", "requestedBy", "nominatedEvaluator", "evaluationStrategy"}
)
public class ApprovalRequest implements Serializable {
    private static final long serialVersionUID = 1L;
    @XmlSchemaType(
        name = "dateTime"
    )
    protected XMLGregorianCalendar requiredConclusionTime;
    protected Integer approvalType;
    @XmlElement(
        required = true
    )
    protected Object businessRequest;
    protected List<Object> supportingInfo;
    protected String messageToEvaluator;
    @XmlElement(
        required = true
    )
    @XmlSchemaType(
        name = "anyURI"
    )
    protected String organisation;
    protected String resubmissionOf;
    protected PersonalInfo requestedBy;
    protected EvaluatorNomination nominatedEvaluator;
    protected EvaluationStrategy evaluationStrategy;

    public ApprovalRequest() {
    }

    public XMLGregorianCalendar getRequiredConclusionTime() {
        return this.requiredConclusionTime;
    }

    public void setRequiredConclusionTime(XMLGregorianCalendar value) {
        this.requiredConclusionTime = value;
    }

    public Integer getApprovalType() {
        return this.approvalType;
    }

    public void setApprovalType(Integer value) {
        this.approvalType = value;
    }

    public Object getBusinessRequest() {
        return this.businessRequest;
    }

    public void setBusinessRequest(Object value) {
        this.businessRequest = value;
    }

    public List<Object> getSupportingInfo() {
        if (this.supportingInfo == null) {
            this.supportingInfo = new ArrayList();
        }

        return this.supportingInfo;
    }

    public String getMessageToEvaluator() {
        return this.messageToEvaluator;
    }

    public void setMessageToEvaluator(String value) {
        this.messageToEvaluator = value;
    }

    public String getOrganisation() {
        return this.organisation;
    }

    public void setOrganisation(String value) {
        this.organisation = value;
    }

    public String getResubmissionOf() {
        return this.resubmissionOf;
    }

    public void setResubmissionOf(String value) {
        this.resubmissionOf = value;
    }

    public PersonalInfo getRequestedBy() {
        return this.requestedBy;
    }

    public void setRequestedBy(PersonalInfo value) {
        this.requestedBy = value;
    }

    public EvaluatorNomination getNominatedEvaluator() {
        return this.nominatedEvaluator;
    }

    public void setNominatedEvaluator(EvaluatorNomination value) {
        this.nominatedEvaluator = value;
    }

    public EvaluationStrategy getEvaluationStrategy() {
        return this.evaluationStrategy;
    }

    public void setEvaluationStrategy(EvaluationStrategy value) {
        this.evaluationStrategy = value;
    }
}

Когда я делаю следующее:

ApprovalRequest approvalRequest = new ApprovalRequest();
Gson gson = new Gson();
String approvalRequestJsonStr = gson.toJson(approvalRequest);

Это работает отлично.

Однако, когда я позволяю приложению работать на сервере JBoss и во время выполнения с заполненным ApprovalRequest, возникает исключение, преобразующее объект в JSON.

Gson gson = new Gson();
String approvalRequestJsonStr = gson.toJson(approvalRequest);

Получает следующую ошибку:

Caused by: java.lang.StackOverflowError
18:40:26,836 ERROR [stderr] (http--0.0.0.0-8443-1)  at com.google.gson.stream.JsonWriter.peek(JsonWriter.java:350)
18:40:26,836 ERROR [stderr] (http--0.0.0.0-8443-1)  at com.google.gson.stream.JsonWriter.beforeName(JsonWriter.java:565)
18:40:26,836 ERROR [stderr] (http--0.0.0.0-8443-1)  at com.google.gson.stream.JsonWriter.writeDeferredName(JsonWriter.java:386)
18:40:26,836 ERROR [stderr] (http--0.0.0.0-8443-1)  at com.google.gson.stream.JsonWriter.value(JsonWriter.java:402)
18:40:26,836 ERROR [stderr] (http--0.0.0.0-8443-1)  at com.google.gson.internal.bind.TypeAdapters$13.write(TypeAdapters.java:353)
18:40:26,836 ERROR [stderr] (http--0.0.0.0-8443-1)  at com.google.gson.internal.bind.TypeAdapters$13.write(TypeAdapters.java:337)
18:40:26,836 ERROR [stderr] (http--0.0.0.0-8443-1)  at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)
18:40:26,836 ERROR [stderr] (http--0.0.0.0-8443-1)  at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:89)
18:40:26,837 ERROR [stderr] (http--0.0.0.0-8443-1)  at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:195)
18:40:26,837 ERROR [stderr] (http--0.0.0.0-8443-1)  at com.google.gson.internal.bind.ObjectTypeAdapter.write(ObjectTypeAdapter.java:105)
18:40:26,837 ERROR [stderr] (http--0.0.0.0-8443-1)  at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)
18:40:26,837 ERROR [stderr] (http--0.0.0.0-8443-1)  at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:96)
18:40:26,837 ERROR [stderr] (http--0.0.0.0-8443-1)  at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:60)
18:40:26,837 ERROR [stderr] (http--0.0.0.0-8443-1)  at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)
18:40:26,837 ERROR [stderr] (http--0.0.0.0-8443-1)  at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:89)
...

Любые идеи, как я могу это исправить?


person Richard    schedule 27.06.2020    source источник
comment
Вы почти наверняка пытаетесь сериализовать объект, который содержит ссылку на себя - не напрямую, а, возможно, в вспомогательных объектах info, businessrequest и т. д. - и это вызовет бесконечный рекурсивный цикл, когда вы попытаетесь его сериализовать.   -  person Michael Berry    schedule 27.06.2020
comment
Что вы отправляете в поле supportingInfo? Это может быть виновником.   -  person Anish B.    schedule 27.06.2020
comment
@PM, спасибо за ответ. Да, я думаю, вы правы. Это довольно сложный объект, который используется другой системой, я просто пытаюсь передать его прокси, а затем передать другой системе. Я настроил прокси-сервер для использования ресурса Spring RESTful для использования «approvalRequest», где исходная система использовала веб-службу SOAP. Как вы думаете, было бы лучше не пытаться преобразовать его в JSON, а попытаться преобразовать его в XML (потому что это то, что представляет собой оболочка SOAP)?   -  person Richard    schedule 27.06.2020
comment
@Richard - я не публиковал никаких комментариев. Ваша благодарность принадлежит кому-то другому.   -  person PM 77-1    schedule 27.06.2020
comment
@ PM77-1 ЛОЛ !! :D   -  person Anish B.    schedule 27.06.2020
comment
«BusinessRequest» и «SupportingInfo» — ElementNSImpl (org.w3c.domNode). Объект ApprovalRequest, к сожалению, взят из библиотеки, которую я не контролирую, и он также используется другими системами, поэтому я не могу его изменить.   -  person Richard    schedule 27.06.2020
comment
Используя Gson, вы можете пометить поля, которые вы хотите включить в json, с помощью @Expose.   -  person Amit kumar    schedule 27.06.2020
comment
К сожалению, мне нужно включить все поля. Возможно, есть способ сериализовать объект? Затем передайте этот сериализованный объект как строку службе, а затем десериализуйте его на другой стороне. то есть не использовать JSON   -  person Richard    schedule 27.06.2020
comment
Я думаю, мне нужно скорее отправить объект XML   -  person Richard    schedule 27.06.2020
comment
Существует обходной путь с использованием пользовательского сериализатора — см. этот вопрос < /а>.   -  person Tomas Zezula    schedule 08.07.2020