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의 시간(여기서 더 자세히 설명)과 순호환하기 위함입니다.
어려운 점은 어떤 물체를 직렬화할 때입니다.LocalDateTime
JSON에게.
예를 들면 다음과 같은 실체가 있습니다.
// ... 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
'itsource' 카테고리의 다른 글
mysql 또는 php에서 'u00e9'를 utf8 char로 변환하는 방법은 무엇입니까? (0) | 2023.10.14 |
---|---|
MariaDB 10.0은 덤프 삽입 시 외부 키 이름을 바꿉니다. (0) | 2023.10.09 |
mysql 출력을 bash 변수로 구문 분석하면 공백으로 인해 깨집니다. (0) | 2023.10.09 |
Sequel Pro?(GUI 기반 sql navigator)를 대체하는 Linux (0) | 2023.10.09 |
사이프러스를 사용하여 드롭다운 목록 항목 선택 (0) | 2023.10.09 |