2015-10-04 2 views
2

При использовании spring-boot я пытаюсь использовать java.time в своем контроллере. В частности, я пытаюсь сделать JavaScript в формате LocalDate дружественным. Дружелюбным я имею в виду вывод его в формате javascript, который может анализировать, а также заставить моего контроллера принимать опубликованные данные (или помещать ... или patch'ed) из углового (или тому подобного).Принимая и возвращаю java.time в моем контроллере

Моя сущность выглядит следующим образом:

@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> 

То, что я в основном ищу способ вернуть типы java.time в JavaScript форматах, а также быть в состоянии получить их, когда я отправляю на мой контроллер.

Я видел, что @DateTimeFormat используется во многих местах, а также @JsonFormat, но я не мог заставить его работать. Также я ищу способ глобально справиться с этим.

Может ли кто-нибудь дать мне некоторую информацию о том, как это сделать?

Полный код можно найти на https://github.com/tonsV2/MyBiz

Update: Я попытался добавить следующий компонент в моем классе @SpringBootApplication.

@Bean 
public ObjectMapper objectMapper() { 
    final ObjectMapper mapper = new ObjectMapper(); 
    mapper.configure(WRITE_DATES_AS_TIMESTAMPS, true); 
    return mapper; 
} 
+0

Не знаю, может ли это помочь, но есть опция, которую вы можете применить к свой ObjectMapper: 'om.configure (WRITE_DATES_AS_TIMESTAMPS, true/false);'. – assylias

+0

@assylias - Я не мог заставить его работать. Я создал компонент и добавил его в свой класс приложений ... вот как это делается, не так ли? Я обновил свой вопрос, чтобы показать, что я сделал. – user672009

ответ

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 является ena кровоточили.

Смежные вопросы