Формат даты в ответе JSON от контроллера - PullRequest
1 голос
/ 10 марта 2020

Я возвращаю JSON в качестве ответа от контроллера . Я хочу отформатировать поля даты в этом ответе.

Контроллер -

@RequestMapping(value = "/call", method = RequestMethod.GET)
public SampleDTO get() 
{
    ......
    return sampleDTO;
}

SampleDTO -

{
   "date" : "2020-03-10T08:57:58+0000",
   "text" : "abc"
}

Я хочу отформатировать поле даты в dd-MM-yyyy

Для этого я добавляю аннотацию @JsonFormat к классу компонента из SampleDTO.

SampleDTO. java -

import java.util.Date;
public class SampleDTO
{ 
    @JsonFormat(pattern = "dd-MM-yyyy") 
    private Date date;

    private String text;

    @JsonFormat(pattern = "dd-MM-yyyy") 
    public void setDate(final Date date)
    {
        this.date = date;
    }

    @JsonFormat(pattern = "dd-MM-yyyy") 
    public Date getDate() 
    {
        return date;
    }

    public void setText(final String text)
    {
        this.text = text;
    }

    public String getText() 
    {
        return text;
    }
}

Тем не менее, я получаю этот формат в ответ на мой браузер.

"дата": "2020-03-10T08: 57: 58 + 0000"



РЕДАКТИРОВАТЬ 1:

Вместо того, чтобы возвращать sampleDTO, преобразование его в String непосредственно в коде работает отлично.

Это работает как талисман:

        SampleDTO sampleDTO = new SampleDTO();
        sampleDTO.setCreated(new Date());
        ObjectMapper om = new ObjectMapper();
        return om.writeValueAsString(sampleDTO);

Ответы [ 3 ]

2 голосов
/ 10 марта 2020

Пожалуйста, убедитесь, что ваш Date из java.util, а не из java.sql пакета. Плюс попробуйте следующее:

@JsonSerialize(as = Date.class)
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="dd-MM-yyyy")
1 голос
/ 11 марта 2020

Существует три уровня решения этой проблемы с форматом даты в Spring.

1) Использование @JsonFormat в полях даты

В этом случае вам нужно использовать одну и ту же аннотацию перед всеми вашими личными участниками.

public class MyBean{

    @JsonFormat(pattern="yyyy-MM-dd")
    private Date birthday;

    @JsonFormat(pattern="yyyy-MM-dd")
    private LocalDate birthday;

    // getters and setters here
}

2) Настройка формата по умолчанию

Если вы хотите настроить настройку по умолчанию формат даты для всех дат в вашем приложении, добавьте следующую строку в файл конфигурации application.properties или application.yml:

spring.jackson.date-format=yyyy-MM-dd

К сожалению, это решение не работает с типами дат Java 8 , как LocalDate и LocalDateTime.

3) Настройка вашего Jackson ObjectMapper

Это решение работает как шарм с Java 8 типами дат.

@Configuration
public class ContactAppConfig {

    private static final String DATE_FORMAT = "yyyy-MM-dd";
    private static final String DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";

    @Bean
    public Jackson2ObjectMapperBuilderCustomizer jsonCustomizer() {
        return builder -> {
            builder.simpleDateFormat(DATE_TIME_FORMAT);
            builder.serializers(new LocalDateSerializer(DateTimeFormatter.ofPattern(DATE_FORMAT)));
            builder.serializers(new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DATE_TIME_FORMAT)));
        };
    }
 }

Предлагаю вам использовать третий вариант.

1 голос
/ 11 марта 2020

Не могли бы вы попробовать это на уровне поля и удалить из метода getDate() в вашем DTO.

Как-то так,

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy")
private Date date;

Это должно работать с вашей текущей версией jackson-databind:2.9.8.jar.

Вот небольшой пример для вас:

public class ExampleMain {

    public static void main(String[] args) throws IOException {
        Employee employee = new Employee();
        employee.setDateOfBirth(Date.from(ZonedDateTime.now().minusYears(30).toInstant()));

        System.out.println("-- before serialization --");
        System.out.println(employee);

        System.out.println("-- after serialization --");
        ObjectMapper om = new ObjectMapper();
        String jsonString = om.writeValueAsString(employee);
        System.out.println(jsonString);

        System.out.println("-- after deserialization --");
        System.out.println(om.readValue(jsonString, Employee.class));
    }
}

public class Employee {

    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy")
    private Date dateOfBirth;


    public Date getDateOfBirth() {
        return dateOfBirth;
    }

    public void setDateOfBirth(Date dateOfBirth) {
        this.dateOfBirth = dateOfBirth;
    }

    @Override
    public String toString() {
        return "Employee{" +
                ", dateOfBirth=" + dateOfBirth +
                '}';
    }
}
...