使用spring-boot时我试图在我的控制器中使用java.time。更具体地说,我试图使LocalDate javascript友好。友好的我的意思是以javascript的形式输出它可以解析并且还让我的控制器接受从角度(或类似)发布的数据(或放置...或补丁)。
我的实体如下所示:
@Entity
public class Expense {
@Id
@GeneratedValue
private long id;
...
private LocalDate date;
public Expense() {
}
public LocalDate getDate() {
return date;
}
public void setDate(final LocalDate date) {
this.date = date;
}
...
}
我的控制器如下所示:
@RestController
@RequestMapping("/api")
public class ExpenseController {
@Autowired
private ExpenseService service;
@RequestMapping("/expense")
public Iterable<Expense> findAll() {
return service.findAll();
}
@RequestMapping(value = "/expense", method = RequestMethod.POST)
public Expense save(@RequestBody Expense expense) {
return service.save(expense);
}
...
}
我已将以下内容添加到我的pom文件中。这导致LocalDate作为[yyyy,mm,dd]列表返回,但javascript并不是那样的。它仍然不接受浏览器发布的格式。
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.5.2</version>
</dependency>
我基本上寻找的是一种以javascript友好格式返回java.time类型的方法,并且当我发布到我的控制器时也可以接收它们。
我已经看到@DateTimeFormat在很多地方使用,以及@JsonFormat,但我无法让它工作。此外,我正在寻找一种全球处理方式。
有人能给我一些关于如何做到这一点的信息吗?
完整的代码可以在https://github.com/tonsV2/MyBiz
找到更新: 我已经尝试将以下bean添加到我的@SpringBootApplication类中。
@Bean
public ObjectMapper objectMapper() {
final ObjectMapper mapper = new ObjectMapper();
mapper.configure(WRITE_DATES_AS_TIMESTAMPS, true);
return mapper;
}
答案 0 :(得分:0)
我认为这应解决问题
@Bean
public Module getLocalDateModule() {
SimpleModule sm = new SimpleModule("LocalDateModule");
sm.addSerializer(LocalDate.class, new JsonSerializer<LocalDate>() {
@Override
public void serialize(LocalDate localDate, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
jsonGenerator.writeString(localDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'00:00:00.000'Z'")));
}
});
return sm;
}
JSR310可能不起作用,因为 https://github.com/FasterXML/jackson-datatype-jsr310
LocalDate,LocalTime,LocalDateTime和OffsetTime,它们不能 可以转换为时间戳,而是表示为 启用WRITE_DATES_AS_TIMESTAMPS时的数组。