问题描述
我们将SpringBoot与Spring Rest和Jackson一起使用。我们使用Java 8 LocalDateTime
。
We use SpringBoot with Spring Rest and Jackson. We use Java 8 LocalDateTime
.
RestController。
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请求时效果很好Accept = application / json
header。这是回复。
It works well when I send a GET request with Accept=application/json
header. This is the response.
{
"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>
时间戳字段为空。如何使它工作?
Timestamp field is empty. How to make it work?
推荐答案
这是解决方案!
这是回复
<?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)注释。
2) Update RestObject class. Add @XmlJavaTypeAdapter(DateTimeAdapter.class) annotation on the LocalDateTime field.
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.
}
我从这里接受了这个想法
和这里
I took the idea from herehttp://blog.bdoughan.com/2011/05/jaxb-and-joda-time-dates-and-times.htmland hereJAXB: Isn't it possible to use an XmlAdapter without @XmlJavaTypeAdapter?
这篇关于Spring rest xml dateTime格式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!