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
Почти със сигурност се опитвате да сериализирате обект, който съдържа препратка към себе си - не директно, но може би в обектите supportinginfo, businessrequest и т.н. - и това ще доведе до безкраен рекурсивен цикъл, когато се опитате да го сериализирате.   -  person Michael Berry    schedule 27.06.2020
comment
Какво изпращате в полето supportingInfo? Това може да е виновникът.   -  person Anish B.    schedule 27.06.2020
comment
@PM, благодаря за отговора. Да, мисля, че сте прав. Това е доста сложен обект, който се използва от друга система, просто се опитвам да го предам на прокси и след това да го предам на другата система. Настроих проксито да използва Spring RESTful Resource за консумиране на „approvalRequest“, където оригиналната система използва SOAP уеб услуга. Мислите ли, че ще е по-добре да не опитвам да го конвертирам в JSON, а по-скоро да опитам да го конвертирам в XML (защото това е SOAP пликът)?   -  person Richard    schedule 27.06.2020
comment
@Richard - Не съм публикувал никакви коментари. Вашата благодарност принадлежи на някой друг.   -  person PM 77-1    schedule 27.06.2020
comment
@PM77-1 LOL !! :Д   -  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