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

为什么Spring控制器不返回上次修改的标题?

楮自珍
2023-03-14

我有一个简单的控制器(为了可读性,已经删除了一些代码,但一般的要点是我正在将上次修改的标题添加到响应中):

    @GetMapping(value = "/{s}", produces = APPLICATION_JSON_VALUE)
public ResponseEntity<DetailsDto> getSaleDetails(
        @RequestHeader(name = "If-Modified-Since", required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) ZonedDateTime ifModifiedSince) {
    final ResponseEntity<DetailsDto> response;
        response = ResponseEntity.ok()
                .header("Cache-Control", "private")
                .header("Last-Modified", "ekofnef") //I have tried with valid dates by the way
                .body(returnThisBody());
    return response;
}

我有以下测试:

    @Test
void testHeader() throws Exception {

    MvcResult responseFromRequest = mockMvc.perform(get(uri())
            .header(CONTENT_TYPE, APPLICATION_JSON_VALUE))
            .andExpect(status().isOk())
            .andReturn();

    assertThat(responseFromRequest.getResponse().getStatus(), is(equalTo(OK.value())));
    assertThat(responseFromRequest.getResponse().getContentAsString() != null, is(equalTo(true)));

    assertThat(responseFromRequest.getResponse().getHeader("Last-Modified"), is(notNullValue()));
}

测试确实调用endpoint,但在断言中失败,在断言中它检查最后修改的头是否为null。我已经调试了它,可以看到当控制器返回响应时,确实填充了头。我可以看到我的缓存控件和上次修改的标题已填充。但是当响应进入测试并且我调试responseFromRequest变量时,我只能看到缓存控制头,而不能看到上次修改的头。。。我不知道为什么。

上次修改的头是否有什么特别之处,我必须配置spring来促进它?

EDIT=我注意到,当日期格式化为DateTimeFormatter时,测试通过。RFC_1123_日期_时间standard。。为什么它不适用于DateTimeFormatter。ISO_日期_时间


共有1个答案

徐涵亮
2023-03-14

Spring响应性。BodyBuilder界面扩展了响应性。校长

使用其中一个设置上次修改的标题:

response = ResponseEntity.ok()
                .header("Cache-Control", "private")
                .lastModified(getResourceLastModifiedDate())
                .body(returnThisBody());

为什么啊?

提到的lastModified方法处理正确的日期时间格式。Last Modified标题需要有效的RFC 1123时间格式,而Last Modified方法可以为您处理此问题。

您可以通过手动为代码设置示例值来测试它:

response = ResponseEntity.ok()
                .header("Last-Modified", "Sun, 21 Oct 2018 12:16:24 GMT")
                .body(returnThisBody());

上面将工作,因为如果一个有效的RFC 1123时间格式的值,但是,正如我所说的,也许最好使用lastModify方法,因为他们已经处理了适当的格式,而没有任何更多的代码在您的身边。

 类似资料:
  • 我想了解一些关于Spring的东西。我正在尝试配置它,但是有些东西我不明白,因为Spring似乎不认识我的控制器。 这是我的web.xml 这就是servlet 控制器:

  • 我只有配置和Spring Security性 登录实现UserDetailsService loginUser用于会话信息 谢谢你阅读。

  • 如果可以从Spring返回,我很好奇 这样做可以吗?我试过了,Spring返回的不是流的值。 我应该继续返回

  • 当我试图更改Mongoose查询返回的数据的任何部分时,它没有任何效果。 昨天我花了大约两个小时试图弄明白这一点,各种各样的s,使用临时存储变量等。最后,就在我觉得自己疯了的时候,我找到了一个解决方案。所以我想到了未来的某个人(Fyuuture!)可能存在保存问题。

  • 我不知道该用什么。我有两页——简介。jsp(1)和booksList.jsp(2)。对于每个页面,我都创建了一个控制器类。第一页有打开第二页的按钮: 第一个问题是:我不确定这个按钮的正确性。它工作得很好,但是按下这个按钮后我有问号。 第二个问题是:当我按下该按钮时,调用带有下一个注释的方法(第二页的控制器): 我应该用这种方法返回什么?换句话说,我怎么能从第一页跳到第二页? < li> < li>

  • 我很难理解mono 的用法。请问这个Mono 能给Mono带来什么样的好处? 谢谢。