Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 格式化来自控制器的JSON响应中的日期_Java_Json_Spring_Date_Hybris - Fatal编程技术网

Java 格式化来自控制器的JSON响应中的日期

Java 格式化来自控制器的JSON响应中的日期,java,json,spring,date,hybris,Java,Json,Spring,Date,Hybris,我返回一个JSON作为控制器的响应。我想格式化此响应中的日期字段 控制器- @RequestMapping(value = "/call", method = RequestMethod.GET) public SampleDTO get() { ...... return sampleDTO; } { "date" : "2020-03-10T08:57:58+0000", "text" : "abc" } 采样到- @RequestMapping(value

我返回一个JSON作为控制器的响应。我想格式化此响应中的日期字段

控制器-

@RequestMapping(value = "/call", method = RequestMethod.GET)
public SampleDTO get() 
{
    ......
    return sampleDTO;
}
{
   "date" : "2020-03-10T08:57:58+0000",
   "text" : "abc"
}
采样到-

@RequestMapping(value = "/call", method = RequestMethod.GET)
public SampleDTO get() 
{
    ......
    return sampleDTO;
}
{
   "date" : "2020-03-10T08:57:58+0000",
   "text" : "abc"
}
我想将日期字段格式化为
dd-MM-yyyy

为此,我将
@JsonFormat
注释添加到
SampleDTO
的bean类中

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,不如在代码中将其直接转换为字符串

这就像一个符咒:

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

请检查您的
Date
是否来自
java.util
,而不是来自
java.sql
包。另外,请尝试以下操作:

@JsonSerialize(as=Date.class)
@JsonFormat(shape=JsonFormat.shape.STRING,pattern=“dd-MM-yyyy”)

请检查您的
日期是否来自
java.util
而不是
java.sql
软件包。另外,请尝试以下操作:

@JsonSerialize(as=Date.class)
@JsonFormat(shape=JsonFormat.shape.STRING,pattern=“dd-MM-yyyy”)

能否在字段级别尝试此操作,并从DTO中的
getDate()
方法中删除

像这样的,

@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 +
                '}';
    }
}

您是否可以在字段级别尝试此操作,并将其从DTO中的
getDate()
方法中删除

像这样的,

@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 +
                '}';
    }
}

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
不幸的是,此解决方案不适用于Java8日期类型,如LocalDate和LocalDateTime

3)自定义Jackson ObjectMapper

这个解决方案对于Java8日期类型也很有吸引力

@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)));
        };
    }
 }

我建议您使用第三个选项。

使用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
不幸的是,此解决方案不适用于Java8日期类型,如LocalDate和LocalDateTime

3)自定义Jackson ObjectMapper

这个解决方案对于Java8日期类型也很有吸引力

@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)));
        };
    }
 }

我建议您使用第三个选项。

您可以使用jstl格式设置日期:)


您可以使用jstl格式格式化日期:)



两条建议:(1)不要使用
Date
。那门课设计得很糟糕,而且早已过时。从中使用
LocalDate
。(2) 在您的JSON使用格式中,所以
yyyy-MM-dd
,而不是
dd-MM-yyy
@OleV.V.:在最新版本的Hybris中,我到处都能看到
Date
类。在我的JSON中,我有一个特定的要求以这种格式显示日期,所以我不能更改它。两个建议:(1)不要使用
date
。那门课设计得很糟糕,而且早已过时。从中使用
LocalDate
。(2) 在您的JSON使用格式中,所以
yyyy-MM-dd
,而不是
dd-MM-yyy
@OleV.V.:在最新版本的Hybris中,我到处都能看到
Date
类。在我的JSON中,我有一个特定的要求以这种格式显示日期,所以我不能更改它。@Farrukh Chishti,上面应该可以,您使用的是什么版本的jackson-databind.jar?@MOnkey:我使用的是2.9。8@FarrukhChishti,上面的应该可以,你用的是什么版本的jackson-databind.jar?@MOnkey:我用的是2.9。8@Farrukh奇什蒂,尝试一下上面的更改。我已经做了建议的更改。从getter中删除注释并保持字段上的注释不变。不走运!在我的代码中,响应在后台自动解析。我没有明确使用任何映射器。我只是将响应返回为
return sampleDTO
@Farrukh Chishti,尝试一下上面的更改。我已经做了建议的更改。从getter中删除注释并保持字段上的注释不变。不走运!在我的代码中,响应在后台自动解析。我没有明确使用任何映射器。我只是返回响应,因为
returnsampledto
Approach#1不起作用。方法#2将导致系统范围内的更改,我不希望这样。我的代码库中缺少方法3:Class
Jackson2ObjectMapperBuilderCustomizer
。谷歌是你的朋友:方法1不起作用。方法#2将导致系统范围内的更改,我不希望这样。方法#3:Class
Jackson2ObjectMapperBuilderCustomizer
在我的代码库中缺失。Google是你的朋友:我只想更改Webservice调用的格式,即在postman中。我只想更改Webservice调用的格式,即在postman中