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

Spring:在不修改域类的情况下格式化REST响应中的日期

程俊力
2023-03-14

我有一个Spring 5(不是Spring Boot)项目,它有一个endpoint返回在依赖关系jar中定义的对象(我不能修改它)。这个对象有一个日期字段(LocalDateTime)。

日期在响应中的格式如下:

{
    "dayOfMonth": 21,
    "dayOfWeek": "THURSDAY",
    "month": "FEBRUARY",
    "year": 2019,
    "dayOfYear": 52,
    "hour": 11,
    "minute": 24,
    "nano": 753000000,
    "second": 32,
    "monthValue": 2,
    "chronology": {
        "id": "ISO",
        "calendarType": "iso8601"
    }
}

我怎么能把is写成ISO 8601或类似的呢?我尝试添加以下依赖项:

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
    <version>2.9.8</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jdk8</artifactId>
    <version>2.9.8</version>
</dependency>

我还尝试为ObjectMapper创建一个主bean:

@Bean
@Primary
public ObjectMapper objectMapper() {
    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.registerModule(new JavaTimeModule());
    objectMapper.registerModule(new Jdk8Module());
    objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
    return objectMapper;
}

映射器在显式使用时工作正常,但在Spring返回JSON REST响应时则不然。

为了简化而不是写完整的代码,我希望像下面这样的endpoint能够正确地隐式格式化日期。

    @GetMapping(path = "/date", produces = "application/json")
    public @ResponseBody ResponseEntity<LocalDateTime> date(@RequestHeader HttpHeaders headers) {
        return new ResponseEntity<>(LocalDateTime.now(), HttpStatus.OK);
    }

谢谢。

共有1个答案

颜志学
2023-03-14

我通过添加一个配置类来修复它,该类将我的ObjectMapper链接到基于此博客条目的HTTPMessageConverter。

@Configuration
public class JacksonConfiguration {

    @Autowired
    ObjectMapper mapper;

    private RequestMappingHandlerAdapter annotationMethodHandlerAdapter;

    @PostConstruct
    public void init() {
        List<HttpMessageConverter<?>> messageConverters = annotationMethodHandlerAdapter.getMessageConverters();
        for (HttpMessageConverter<?> messageConverter : messageConverters) {
            if (messageConverter instanceof MappingJackson2HttpMessageConverter) {
                MappingJackson2HttpMessageConverter m = (MappingJackson2HttpMessageConverter) messageConverter;
                m.setObjectMapper(mapper);
            }
        }
    }

    @Autowired
    public void setAnnotationMethodHandlerAdapter(RequestMappingHandlerAdapter annotationMethodHandlerAdapter) {
        this.annotationMethodHandlerAdapter  = annotationMethodHandlerAdapter;
    }
}
 类似资料:
  • 问题内容: 如果我用javadoc 编写,它不会出现,因为标签在格式化文本方面具有特殊功能。 如何在Javadoc中显示此字符? 问题答案: 您可以使用为 < 和为 > 。

  • 问题内容: 调用a 并获取列的响应将日期值设置为 但。目前,我有一个类似的日期值。我想将此值转换为Edm.DateTIme格式,如上所示。 任何功能都可以实现相同。任何工作。请帮忙。 问题答案: 下列: 打印出: 请注意时区的转换。Java 希望在偏移量中使用冒号。 说到时区,我不知道OData Atom XML是否在某处指定了时区。Edm.DataTime没有此类功能。 编辑 :如果要将输出转换

  • 我使用ClientHttpRequestInterceptor报告RestTemplate的请求输出和响应。如果出现异常,我需要记录响应,比如模板是否试图用错误的类取消对响应的处理。 这就是拦截器的启用方式: 这里唯一接受的接口是ClientHttpRequestInterceptor。拦截器看起来像: 我知道这门课不可能得到回应,你能给出一个替代的解决方案吗? 这是异常的一个例子:(请不要解释如

  • 问题内容: 我需要在 不更改URL的情况下 进行路由。 在自己实现此功能之前,我尝试过通过React Router寻找一些东西。我看到有这样一个东西 : createMemoryHistory([options]) createMemoryHistory创建一个不与浏览器URL交互的内存历史对象。当您需要自定义用于服务器端呈现,自动测试的历史记录对象或不想操纵浏览器URL(例如,将应用程序嵌入到i

  • 本文向大家介绍mysql不重启的情况下修改参数变量,包括了mysql不重启的情况下修改参数变量的使用技巧和注意事项,需要的朋友参考一下 通常来说,更新mysql配置my.cnf需要重启mysql才能生效,但是有些时候mysql在线上,不一定允许你重启,这时候应该怎么办呢? 看一个例子: mysql> show variables like 'log_slave_updates'; +-------