기본 생성자가 있더라도 개체 값(위임자 또는 속성 기반 생성자 없음)에서 직렬을 해제할 수 없습니다.
제 수업은 마치
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
'programing' 카테고리의 다른 글
| 스프링 부트테스트 : 'org.springframework.test.web.servlet' 유형의 정규 빈이 없습니다.MockMvc' 사용 가능: (0) | 2023.03.01 |
|---|---|
| React는 상태 업데이트 순서를 유지합니까? (0) | 2023.03.01 |
| Respect useRef 훅을 타이프 스크립트와 함께 사용하는 방법 (0) | 2023.03.01 |
| WooCommerce REST API에서 "리소스를 나열할 수 없습니다" 오류가 발생했습니다. (0) | 2023.03.01 |
| 로컬 json 파일에 데이터를 쓸 수 있는 것은 angular만 있으면 됩니다. (0) | 2023.03.01 |