programing

기본 생성자가 있더라도 개체 값(위임자 또는 속성 기반 생성자 없음)에서 직렬을 해제할 수 없습니다.

newnotes 2023. 3. 1. 11:30
반응형

기본 생성자가 있더라도 개체 값(위임자 또는 속성 기반 생성자 없음)에서 직렬을 해제할 수 없습니다.

제 수업은 마치

class MyClass {
    private byte[] payload;

    public MyClass(){}

    @JsonCreator
    public MyClass(@JsonProperty("payload") final byte[] payload) {
        this.payload = payload;
    }

    public byte[] getPayload() {
        return this.payload;
    }

}

나는 잭슨을 이용하고 있어. 그러니 연재하고 나서 다시 연재하지.시리얼화는 정상적으로 동작합니다만, 시리얼화 해제중에 다음의 에러 메세지가 표시됩니다.

Cannot construct instance of `mypackage.MyClass` (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)

나는 이 문제에 대해 온라인에서 읽고 있었는데, 디폴트 컨스트럭터 또는 컨스트럭터를 사용하는 것을 추천하는 몇 개의 텍스트를 우연히 발견했다.@JsonCreator주석입니다.둘 다 추가하려고 했는데도 예외예요.내가 뭘 놓쳤지?

편집:

더 나은 해결책을 찾았어요. Paranamer Module을 추가해 주세요.ObjectMapper:

mapper.registerModule(new ParanamerModule());

메이븐:

<dependency>
    <groupId>com.fasterxml.jackson.module</groupId>
    <artifactId>jackson-module-paranamer</artifactId>
    <version>${jackson.version}</version>
</dependency>

ParameterNamesModule에 대한 장점은 클래스를 컴파일할 필요가 없다는 것입니다.-parameters논쟁.

편집 종료


Jackson 2.9.9에서는 이 단순한 POJO를 역직렬화하려고 했지만 동일한 예외가 발생하여 디폴트 컨스트럭터가 문제를 해결했습니다.

POJO:

public class Operator {

    private String operator;

    public Operator(String operator) {
        this.operator = operator;
    }

    public String getOperator() {
        return operator;
    }
}

오브젝트 맵퍼 및 시리얼화/디시리얼화:

ObjectMapper mapper = new ObjectMapper();
mapper.setVisibility(PropertyAccessor.ALL, Visibility.NONE);
mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
mapper.setVisibility(PropertyAccessor.CREATOR, Visibility.ANY);

String value = mapper.writeValueAsString(new Operator("test"));
Operator result = mapper.readValue(value, Operator.class);

JSON:

{"operator":"test"}

예외:

com.fasterxml.jackson.databind.exc.MismatchedInputException: 
Cannot construct instance of `...Operator` (although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator)
 at [Source: (String)"{"operator":"test"}"; line: 1, column: 2]

솔루션(기본 생성자가 있는 POJO):

public class Operator {

    private String operator;

    private Operator() {
    }

    public Operator(String operator) {
        this();
        this.operator = operator;
    }

    public String getOperator() {
        return operator;
    }
}

나는 이 같은 문제를 관찰했다.Json Creator 타입이 잘못되어 문제가 발생하였습니다.org.codehouse.jackson.annotate를 잘못 사용했습니다.Json Creator. 단, com.fasterxml.jackson.annotation을 사용해야 합니다.대신 Json Creator를 사용합니다.

이 에러가 발생해, https://newbedev.com/no-creators-like-default-construct-exist-cannot-deserialize-from-object-value-no-delegate-or-property-based-creator 에 접속했습니다.

기본적으로 추가됨

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)

데코레이터들 덕분에 잘 됐어요.

하위 클래스 개체에 기본 생성자를 추가합니다.

public NameOfClass() {
    super();
}

우연히 이런 연재화, 탈직렬화를 발견했는데kotlin data classes속성에 기본값을 추가한 후 값을 읽기만 하면 됩니다.

data class DataClass(
  val key: String = "",    //  adding these default 
  val value: String = ""   //  values worked
)

를 제외하고= ""에러가 표시됩니다.

Cannot construct instance of `com.xxx.DataClass` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)

같은 문제에 부딪혔는데, 위의 해결 방법 중 어느 것도 도움이 되지 않았습니다.디버깅 빌드가 정상적으로 동작하고 있는 것을 발견한 후 R8은 릴리스 빌드에서 잭슨이 필요로 하는 코드를 삭제하고 있었기 때문에 비난을 받았습니다.추가 중@JsonAutoDetect모든 커스텀클래스 의존관계로 버그를 해결했습니다.

@JsonAutoDetect
data class Car(
    val name: String // annotation not needed
    val engine: Engine // annotation needed
)
// @JsonAutoDetect is needed here
data class Engine(
    val name: String
)

저도 같은 상황에 처해 있었습니다.저 같은 경우는 자바에서 REST API를 소비하는 스테이트먼트에...그러나 여러 번 시도 후 필드를 사용하여 이미 컨스트럭터를 선언했기 때문에 기본 컨스트럭터를 추가해야 합니다.

public NameofClass() {
        super();
        // TODO Auto-generated constructor stub
    }

언급URL : https://stackoverflow.com/questions/52708773/cannot-deserialize-from-object-value-no-delegate-or-property-based-creator-ev

반응형