Spring rest xml dateTime 格式

Posted

技术标签:

【中文标题】Spring rest xml dateTime 格式【英文标题】:Spring rest xml dateTime format 【发布时间】:2017-11-11 14:08:36 【问题描述】:

我们将 SpringBoot 与 Spring Rest 和 Jackson 一起使用。我们使用 Java 8 LocalDateTime

休息控制器。

@RestController
@RequestMapping(method = RequestMethod.GET, produces = MediaType.APPLICATION_XML_VALUE, MediaType.APPLICATION_JSON_VALUE)
public class SimpleRestController 

    @Autowired
    private RestService restService;

    @RequestMapping("/api/id")
    public ResponseEntity<RestObject> getModel(@PathVariable Long id) 
        RestObject restObject = restService.getModel(id);
        HttpStatus httpStatus = HttpStatus.OK;

        if (restObject == null) 
            httpStatus = HttpStatus.NO_CONTENT;
        

        return new ResponseEntity<>(restObject, httpStatus);
    

RestObject 由控制器返回。

import javax.xml.bind.annotation.XmlRootElement;
import java.io.Serializable;
import java.time.LocalDateTime;

@XmlRootElement
public class RestObject implements Serializable 

    private LocalDateTime timestamp;
    private String title;
    private String fullText;
    private Long id;
    private Double value;

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    public LocalDateTime getTimestamp() 
        return timestamp;
    

    //Other getters and setters.

当我发送带有 Accept=application/json 标头的 GET 请求时,它运行良好。这是响应。


  "timestamp": "2017-06-09 15:58:32",
  "title": "Rest object",
  "fullText": "This is the full text. ID: 10",
  "id": 10,
  "value": 0.22816149915219197

然而Accept=application/xml:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<restObject>
    <fullText>This is the full text. ID: 10</fullText>
    <id>10</id>
    <timestamp/>
    <title>Rest object</title>
    <value>0.15697306201038086</value>
</restObject>

时间戳字段为空。如何让它发挥作用?

【问题讨论】:

LocalDateTime 来自 Java 8 还是 jodatime? Java 8 - java.time 不支持 Java 8 LocalDateTime。使用 Joda LocalDateTime 或编写转换器。这可能会帮助***.com/questions/29424551/… @Hugo 感谢编辑! 【参考方案1】:

解决方案来了!

这是回复

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<restObject>
    <fullText>This is the full text. ID: 10</fullText>
    <id>10</id>
    <timestamp>2017-06-09 16:31:01</timestamp>
    <title>Rest object</title>
    <value>0.0021564103099468435</value>
</restObject>

1) 添加类DateTimeAdapter

import javax.xml.bind.annotation.adapters.XmlAdapter;
import java.time.LocalDateTime;

public class DateTimeAdapter extends XmlAdapter<String, LocalDateTime> 

    public static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
    public static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern(DATE_FORMAT);

    public LocalDateTime unmarshal(String v) throws Exception 
        return LocalDateTime.parse(v, DATE_TIME_FORMATTER);
    

    public String marshal(LocalDateTime v) throws Exception 
        return DATE_TIME_FORMATTER.format(v);
    

2) 更新 RestObject 类。在 LocalDateTime 字段上添加 @XmlJavaTypeAdapter(DateTimeAdapter.class) 注释。

import com.ca.training.rest.server.config.DateTimeAdapter;
import com.fasterxml.jackson.annotation.JsonFormat;

import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import java.io.Serializable;
import java.time.LocalDateTime;

import static com.ca.training.rest.server.config.DateTimeAdapter.DATE_FORMAT;

@XmlRootElement
public class RestObject implements Serializable 

    private LocalDateTime timestamp;
    private String title;
    private String fullText;
    private Long id;
    private Double value;

    @XmlJavaTypeAdapter(DateTimeAdapter.class)
    @JsonFormat(pattern = DATE_FORMAT)
    public LocalDateTime getTimestamp() 
        return timestamp;
    

    //Other getters and setters.

我从这里得到了这个想法 http://blog.bdoughan.com/2011/05/jaxb-and-joda-time-dates-and-times.html 和这里 JAXB: Isn't it possible to use an XmlAdapter without @XmlJavaTypeAdapter?

【讨论】:

以上是关于Spring rest xml dateTime 格式的主要内容,如果未能解决你的问题,请参考以下文章

在Spring REST Controller中使用Jackson Deserialization for DateTime

RESTFUL web service spring,XML而不是JSON?

Spring Rest Service 不适用于 XML 响应

Spring 4 mvc REST XML 和 JSON 响应

spring boot Joda DateTime 序列化

Spring Boot REST API 返回 XML 作为响应