안녕하세요. 다메카솔입니다. 🐿️

개발중에 발생한 에러를 예방하기위해 원인과 해결방법을 정리해보았습니다.

발생 배경

API에 Request를 보낼때, 서버에서 다음과 같은 에러가 발생하였습니다.

오류 메시지

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

원인

위 에러는  주로 Jackson 또는 다른 JSON 라이브러리를 사용하여 JSON 데이터를 해당 클래스의 객체로 변환하는 중에 발생합니다. 이러한 라이브러리들은 클래스를 직렬화하거나 역직렬화할 때 기본 생성자 (default constructor) 또는 특정 생성자를 사용하는데, 클래스에 기본 생성자가 없거나 또는 라이브러리가 사용할 수 있는 생성자가 없을 때 발생합니다.

블록을 조립한 레고 이미지

 

직렬화와 역직렬화에 대해 더 궁금하시다면 아래 글도 함께 읽기 좋습니다.

https://damecasol.tistory.com/33

 

[Java]Serializable 직렬화

가끔 인터페이스를 보다보면 Serializable 이란 인터페이스를 상속한 클래스를 볼 수 있었다. 검색해봤을땐 직렬화를 가능하게 해주는 인터페이스고, 그렇게 하여 파일이나과 인터넷으로 객체를

damecasol.tistory.com

 

해결방법

  • 기본생성자 추가

클래스에 기본 생성자를 추가합니다.. 기본 생성자란 매개변수를 가지지 않는 생성자입니다.

public class YourClass {
    public YourClass() {
        // 기본 생성자 내용
    }
}
  • 매개변수가 있는 생성자의 존재

클래스에 매개변수가 있는 생성자가 있는 경우, 해당 생성자도 정의되어 있는지 확인합니다. 만약 라이브러리가 특정 생성자를 필요로 하는데 그 생성자가 없다면 이 오류가 발생할 수 있습니다.

public class YourClass {
    public YourClass(String param1, int param2) {
        // 매개변수가 있는 생성자 내용
    }
}
  • @JsonCreator 어노테이션 사용

만약 여러 생성자가 있는 경우, Jackson 라이브러리에서 사용할 생성자를 명시하기 위해 @JsonCreator 어노테이션을 사용할 수 있습니다.

public class YourClass {
    private String param1;
    private int param2;

    @JsonCreator
    public YourClass(@JsonProperty("param1") String param1, @JsonProperty("param2") int param2) {
        this.param1 = param1;
        this.param2 = param2;
    }
}

참조

https://fasterxml.github.io/jackson-databind/javadoc/2.13/com/fasterxml/jackson/databind/ObjectMapper.html

 

ObjectMapper (jackson-databind 2.13.0 API)

Convenience method for doing two-step conversion from given value, into instance of given value type, by writing value into temporary buffer and reading from the buffer into specified target type. This method is functionally similar to first serializing gi

fasterxml.github.io

 

문의 사항이나 도움이 필요하신 분은 댓글 달아주세요!

'IT > JAVA' 카테고리의 다른 글

[Mybatis] CDATA 란?  (0) 2023.03.15
[Java]Serializable 직렬화  (0) 2022.06.12

여러가지 버전의 윈도우

증상

* What went wrong:
Execution failed for task ':sonar'.
> org/sonar/batch/bootstrapper/EnvironmentInformation has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0

젠킨스 파이프라인을 이용해 SonarQube 정적분석을 실행하려고 할 때, 위와같은 에러 메세지가 발생하였습니다.

원인

위 에러는 Java 실행환경이 클래스파일 버전을 52.0까지 지원하지만, 컴파일된 버전의 클래스 버전이 55버전이라 발생한 문제입니다. 

해결책

가장 간단한 해결책은 Java Runtime을 더 최신 버전으로 업데이트하는 것입니다. 이렇게 하면 최신 버전의 클래스 파일도 인식할 수 있게 됩니다. Oracle 또는 OpenJDK 웹 사이트에서 Java Development Kit (JDK)의 최신 버전을 다운로드하여 설치할 수 있습니다.

 

참고자료

Java 버전 업데이트: https://www.oracle.com/java/technologies/javase-jdk13-downloads.html

 

Download the Latest Java LTS Free

Subscribe to Java SE and get the most comprehensive Java support available, with 24/7 global access to the experts.

www.oracle.com

클래스 파일 버전 다운그레이드: https://docs.oracle.com/javase/8/docs/technotes/tools/windows/javac.html#BABGBJCI

Gradle 설정: https://docs.gradle.org/current/userguide/java_plugin.html#sec:java_plugin_and_java_version

 

The Java Plugin

If a dependent project has changed in an ABI-compatible way (only its private API has changed), then Java compilation tasks will be up-to-date. This means that if project A depends on project B and a class in B is changed in an ABI-compatible way (typicall

docs.gradle.org

 

+ Recent posts