[스프링(spring)]오류를 모아보자

allnight5·2022년 12월 22일
0

스프링

목록 보기
16/62

목차
1.Java 8 date/time type java.time.LocalDateTime not supported by default
LocalDataTime을 역직렬화하지 못해서 생기는 문제입니다.

2.특정 dto 를 반환해주는 api에서 406 에러가 발생
3.GroovyRuntimeException: Conflicting module versions
4.failed to lazily initialize a collection of role: could not initialize proxy - no Session
5. implementation group: 'it.ozimov', name: 'embedded-redis', version: '0.7.3' 으로 인한 오류발생()

1. Java 8 date/time type java.time.LocalDateTime not supported by default

목차로 이동
LocalDataTime을 역직렬화하지 못해서 생기는 문제입니다.
jackson-datatype-jsr310 종속성을 추가하고 해결해야 됩니다.

//자바 역직렬화 문제 해결 패키지
implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310'
implementation 'com.fasterxml.jackson.core:jackson-databind'
추가적으로 만약 캐시로 사용할 객체에 LocalDateTime 타입의 값이 존재한다면 위처럼 @JsonSerialize, @JsonDeserialize 어노테이션을 기입해줘야 합니다.. 그렇지 않으면 오류가 발생합니다. (대다수의 Entity에 공통적으로 created_at, updated_at을 넣어주기 위해 위처럼 MappedSuperclass를 사용하고 있다)

2.특정 dto 를 반환해주는 api에서 406 에러가 발생

목차로 이동
자세한 사이트
스프링은 별도로 지정해주지 않는 이상 직렬화/역직렬화 방법으로 Jackson 라이브러리를 이용한다
Jackson은 Java Object를 Json 형태로 변환시켜주거나, 반대로 Json 객체를 Java Object 형태로 변환시켜주는 라이브러리이다.
db table에는 java object를 담을 수 없기 때문에 영속화를 위해선 json 형태로 변환해주는 라이브러리가 필요하다.
그런데 Jackson이 Java Object를 Json 형태로 변환시켜주기 위해선 각 필드의 getter 메서드와 기본생성자를 필요로 한다.
jackson이 데이터를 bind하는 과정에서 문제가 생겼다는 것인데,

Type definition error: [simple type, class chess.dto.MoveDto]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of chess.dto.MoveDto (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator) at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 1, column: 2]

기본 생성자가 존재하지 않아 deserialize가 되지 않았다는 것이다.
Json 객체로 요청값은 받아왔는데, MoveDto에 기본생성자가 존재하지 않아 MoveDto로 역직렬화가 되지 않았다는 것이다.

직렬화 에러는 +) 406 에러 말고도, 400 에러, 500 에러가 뜨기도 하는 듯하다. 스프링 환경에서 직렬화/역직렬화 기능을 제대로 작동시키기 위해 dto (또는 responseentity에 담아주는 클래스)에 getter, 기본생성자를 만들어주도록 하자.

3. GroovyRuntimeException: Conflicting module versions

목차로 이동
자세한 사이트
build.gradle의 버전이 문제인 상황일때 벌어지는 에러이다

4. failed to lazily initialize a collection of role: could not initialize proxy - no Session

목차로 이동
JPA관련 오류로 @Transactional 어노테이션이 없다든지.
이미 종료된 컨텍스트를 이용하여 조회하려 한다던지. 그럴때 일어날수있는 오류로 비어있는 데이터를 넣어주려 하거나 조회하려 할때 일어난다

5. implementation group: 'it.ozimov', name: 'embedded-redis', version: '0.7.3' gradle에 의존성 주입시 에러 발생

목차로 이동

SLF4J: Class path contains multiple SLF4J providers.
SLF4J: Found provider [org.slf4j.simple.SimpleServiceProvider@400cff1a]
SLF4J: Found provider [ch.qos.logback.classic.spi.LogbackServiceProvider@275710fc]
SLF4J: See https://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual provider is of type [org.slf4j.simple.SimpleServiceProvider@400cff1a]
Exception in thread "main" java.lang.IllegalArgumentException: LoggerFactory is not a Logback LoggerContext but Logback is on the classpath. Either remove Logback or the competing implementation (class org.slf4j.simple.SimpleLoggerFactory loaded from file:/C:/Users/mind/.gradle/caches/modules-2/files-2.1/org.slf4j/slf4j-simple/2.0.7/bfa4d4dad645a5b11c022ae0043bac2df6cf16b5/slf4j-simple-2.0.7.jar). If you are using WebLogic you will need to add 'org.slf4j' to prefer-application-packages in WEB-INF/weblogic.xml: org.slf4j.simple.SimpleLoggerFactory

위의 내용이 에러로 뜨는데 아래는 좀 더 길다.
implementation group: 'it.ozimov', name: 'embedded-redis', version: '0.7.3'
라는 스프링 부트에서 기본적으로 실행시 제공하는 로컬 레디스이다.
하지만 기본적으로 slf4j의 내가 가진것과 다른 것을 가지고 있거나
plugins{
id 'war'
}

위와 같이 jar가 아니라 war일 경우 안될 수 있다.

보면.. 다른 의존성을 넣었을때.. jar로는 돌아갔으나 war로 안되는거보면 war로 했을때
뭔가 안돌아 가는게 있는것 같은데

profile
공부기록하기

0개의 댓글