当前位置: 首页 > 知识库问答 >
问题:

Spring rest xml日期时间格式

晏卓君
2023-03-14

我们使用带Spring垫和Jackson的SpringBoot。我们使用Java 8。

RestController。

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

当我用头发送GET请求时,它工作得很好。这就是答案。

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

但是接受=应用程序/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>

时间戳字段为空。如何使其工作?

共有1个答案

吴鸿彩
2023-03-14

解决方案来了!

这是回应

<?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:XmlAdapter不需要@XmlJavaTypeAdapter吗?

 类似资料:
  • 下表显示可用于为图表中的日期时间字段创建用户定义的数据格式的说明符。 说明符 描述 D 将日显示为不带前导零的数字(1-31)。 DD 将日显示为带前导零的数字(01-31)。 M 将月份显示为不带前导零的数字(1-12)。 MM 将月份显示为带前导零的数字(01-12)。 MMM 将月份显示为缩写形式(Jan-Dec)。 MMMM 将月份显示为完整月份名(January-December)。 Y

  • 下表显示可用于为图表中的日期时间字段创建用户定义的数据格式的说明符。 说明符 描述 D 将日显示为不带前导零的数字(1-31)。 DD 将日显示为带前导零的数字(01-31)。 M 将月份显示为不带前导零的数字(1-12)。 MM 将月份显示为带前导零的数字(01-12)。 MMM 将月份显示为缩写形式(Jan-Dec)。 MMMM 将月份显示为完整月份名(January-December)。 Y

  • 下表显示可用于为图表中的日期时间字段创建用户定义的数据格式的说明符。 说明符 描述 D 将日显示为不带前导零的数字(1-31)。 DD 将日显示为带前导零的数字(01-31)。 M 将月份显示为不带前导零的数字(1-12)。 MM 将月份显示为带前导零的数字(01-12)。 MMM 将月份显示为缩写形式(Jan-Dec)。 MMMM 将月份显示为完整月份名(January-December)。 Y

  • 问题内容: 我需要改变从一个日期/时间 2014年8月20日15:30:00 看起来像 二○一四年八月二十○日下午3:30 可以使用javascript的Date对象完成此操作吗? 问题答案: 是的,您可以使用本地javascript Date() 对象 及其方法。 例如,您可以创建一个类似以下的函数: 并显示上午/下午和正确的时间。 请记住使用 getFullYear() 方法,而不要使用get

  • 主要内容:日期格式化符号,Python处理,Pandas处理当进行数据分析时,我们会遇到很多带有日期、时间格式的数据集,在处理这些数据集时,可能会遇到日期格式不统一的问题,此时就需要对日期时间做统一的格式化处理。比如“Wednesday, June 6, 2020”可以写成“6/6/20”,或者写成“06-06-2020。 日期格式化符号 在对时间进行格式化处理时,它们都有固定的表示格式,比如小时的格式化符号为 ,分钟简写为 ,秒简写为 。下表对常用的日期

  • 有没有一种方法可以编写一个模式,该模式解析器“要么”两个可选部分之一?类似于()? 例如: 我想分析短(

  • 问题内容: 我有一个类似的日期/时间字符串,但我想将其转换为,我该怎么做? 我正在使用以下代码,但会引发异常。 问题答案: 您可以执行简单的字符串操作并创建js日期对象。请参见下面的函数,该函数接受// yyyy-mm-dd hh:mm:ss格式的日期

  • 我有一个以下格式的字符串: 我想利用这个时刻。js以这种格式获取它,用于显示。 我试着用这个方法, 哪些错误并表示没有称为“替换”的方法?我是不是走错了路? 我还应该提到,我正在使用一个预打包版本的矩。js,为Meteor打包。js 堆栈跟踪: