itsource

java.time을 serializing하는 Spring boot 문제가 발생했습니다.ISO-8601 JSON 타임스탬프를 반환하는 LocalDateTime with Jackson?

mycopycode 2023. 10. 9. 22:35
반응형

java.time을 serializing하는 Spring boot 문제가 발생했습니다.ISO-8601 JSON 타임스탬프를 반환하는 LocalDateTime with Jackson?

java 8's를 사용하기 위해 스프링부트 REST API 앱에서 일부 모델을 변환하는 작업을 하고 있습니다.java.time.LocalDateTime조다의 것 대신에DateTime. API 호출에서 반환되는 타임스탬프가 에 적용되도록 합니다.ISO_8601체재를 갖추다동기부여는 Java 8의 시간(여기서 더 자세히 설명)과 순호환하기 위함입니다.

어려운 점은 어떤 물체를 직렬화할 때입니다.LocalDateTimeJSON에게.

예를 들면 다음과 같은 실체가 있습니다.

// ... misc imports

import java.time.LocalDateTime;
import java.time.ZoneOffset;

@Data 
@Entity
@Table(name = "users")
public class User {

    @Id @Column
    private String id;

    @Column
    private String name;

    @Column
    private String email;

    @Column
    @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss", timezone = "UTC")
    private java.time.LocalDateTime createdAt;

    public User(String name, String email) {
        this.id = Utils.generateUUID();
        this.createdAt = LocalDateTime.now(ZoneOffset.UTC);
    }
}

나는 또한 내 것을 설정을 했습니다.application.properties타임스탬프 잭슨 기능으로 날짜를 끄려면:

spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS = false

내가 만든 깊이:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>1.3.6.RELEASE</version>
</dependency>

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
    <version>2.8.1</version>
</dependency>

<dependency>
     <groupId>org.hibernate</groupId>
     <artifactId>hibernate-core</artifactId>
     <version>5.0.1.Final</version>
 </dependency>

마지막으로 컨트롤러를 통해 JSON 표현을 검색하려고 합니다.

@RequestMapping("/users")
@RestController
public class UserController {

    private UserService userService;

    @Autowired
    public UserController(UserService userService) {
        this.userService = userService;
    }

    @RequestMapping(
        value = "/{id}",
        method = RequestMethod.GET,
        produces = MediaType.APPLICATION_JSON_UTF8_VALUE
    )
    public User getUser(@PathVariable("id") String id) {
        return userService.findById(id);
    }
}

실제로 이 엔드포인트로 전화를 걸면 다음과 같은 예외가 발생합니다.

java.lang.NoSuchMethodError: 
com.fasterxml.jackson.datatype.jsr310.ser.JSR310FormattedSerializerBase.findFormatOverrides(Lcom/fasterxml/jackson/databind/SerializerProvider;Lcom/fasterxml/jackson/databind/BeanProperty;Ljava/lang/Class;)Lcom/fasterxml/jackson/annotation/JsonFormat$Value;

또는 앱을 구성하기도 했습니다.ObjectMapper구성 클래스에서 다음을(를)

@Configuration
public class ServiceConfiguration {

    @Bean
    public ObjectMapper getJacksonObjectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.registerModule(new JavaTimeModule());
        objectMapper.configure(
            com.fasterxml.jackson.databind.SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,
            false
        );
        return objectMapper;
    }
}

어떤 단서라도 주신다면 대단히 감사하겠습니다.


업데이트:

스프링부트의 잭슨 버전과 제가 가지고 있던 버전이 일치하지 않는 것으로 드러났습니다.pom.xml. 마일로시와 앤디가 제안한 대로 버전을 정확하게 설정하고 앱을 실행하면,spring.jackson.serialization.write_dates_as_timestamps=true, 구성할 필요 없이 문제가 해결되었습니다.ObjectMapper또는 내 주석에 주석을 추가합니다.LocalDateTime모형 필드

    ...
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>1.3.6.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>1.3.6.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.datatype</groupId>
            <artifactId>jackson-datatype-jsr310</artifactId>
        </dependency>

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
        </dependency>

    </dependencies>

NoSuchMethodError잭슨 버전을 섞고 있기 때문입니다.Spring Boot 1.3.6은 Jackson 2.6.7을 사용하고 있고 당신은 2.8.1의jackson-datatype-jsr310.

Spring Boot는 Jackson에 대한 의존성 관리 기능을 제공합니다.jackson-datatype-jsr310, 폼에서 버전을 제거해야 합니다.Jackson의 다른 버전을 사용하고 싶다면, 당신은 그것을 재정의해야 합니다.jackson.version속성:

<properties>
    <jackson.version>2.8.1</jackson.version>
</properties>

이렇게 하면 모든 Jackson 의존 관계가 동일한 버전을 갖게 되므로 일치하지 않는 버전의 문제를 방지할 수 있습니다.

당신이 원한다면, 당신은 또한 당신의 자바 코드를 제거할 수 있습니다.ObjectMapper. Java Time 모듈은 클래스 경로에 있을 때 자동으로 등록되고 타임스탬프가 구성될 수 있는 날짜를 작성합니다.application.properties:

spring.jackson.serialization.write-dates-as-timestamps=false

당신의.ObjectMapper콩은 다음과 같이 표시해야 합니다.@Primary봄에 데리러 가기 위해서다른 방법으로, 당신은 단지 다음과 같이 만들 수 있습니다.JavaTimeModule그리고 그것은 스프링에 의해 픽업되어 기본 오브젝트 맵퍼에 추가됩니다.

아마 이미 보셨겠지만 공식 문서를 번 보세요.

Jackson 버전을 혼합하면 오류가 발생합니다.다를(를) .1.3.6.RELEASE스프링부츠의. 경우2.x.x.RELEASE그러면 당신은 교체할 수 있습니다.com.fasterxml.jackson.datatype존에 의한 .spring-boot-starter-json의존. 가 올바른 버전을할 수 .이렇게 하면 Spring Boot가 올바른 Jackson 버전을 처리할 수 있습니다.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-json</artifactId>
</dependency>

언급URL : https://stackoverflow.com/questions/38628674/spring-boot-issues-serializing-java-time-localdatetime-with-jackson-to-return-is

반응형