Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot 在Spring集成测试中将分区时间转换为UTC_Spring Boot_Spring Webflux_Reactive - Fatal编程技术网

Spring boot 在Spring集成测试中将分区时间转换为UTC

Spring boot 在Spring集成测试中将分区时间转换为UTC,spring-boot,spring-webflux,reactive,Spring Boot,Spring Webflux,Reactive,我正在尝试验证我的反应式rest控制器是否传输了正确的数据。此数据包含我需要保留的ZonedDateTime字段。但是,当使用WebTestClient查询rest控制器时,我的验证失败,因为收到的时间突然以UTC为单位 @Data public class SimpleData { ZonedDateTime zdt; } @RestController class SimpleDataController { @Autowired SimpleDataService ser

我正在尝试验证我的反应式rest控制器是否传输了正确的数据。此数据包含我需要保留的
ZonedDateTime
字段。但是,当使用
WebTestClient
查询rest控制器时,我的验证失败,因为收到的时间突然以UTC为单位

@Data
public class SimpleData {
    ZonedDateTime zdt;
}

@RestController
class SimpleDataController {
    @Autowired SimpleDataService service;
    @GetMapping("/simple")
    List<SimpleData> getData() {
        return service.getTimes();
    }
}

@Service
class SimpleDataService {
    public static final SimpleData DATA = new SimpleData();
    static {
        DATA.setZdt(ZonedDateTime.now(ZoneId.of("Europe/Berlin")));
    }

    public List<SimpleData> getTimes() {
        return List.of(DATA);
    }
}
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
@ActiveProfiles("test")
class ApplicationTests {
    @Test
    void simpleDataTest() {
        List<SimpleData> fromRest = WebTestClient.bindToServer().baseUrl("http://localhost:8080").build()
             .get().uri("/simple").exchange()
             .expectBodyList(SimpleData.class)
             .returnResult().getResponseBody();
        assertThat(fromRest).containsAll(Collections.singletonList(SimpleDataService.DATA));
    }
}
@数据
公共类SimpleData{
分区时间zdt;
}
@RestController
类SimpleDataController{
@自动连线SimpleDataService服务;
@GetMapping(“/simple”)
列表getData(){
return service.getTimes();
}
}
@服务
类SimpleDataService{
公共静态最终SimpleData数据=新SimpleData();
静止的{
DATA.setZdt(ZoneDateTime.now(ZoneId.of(“欧洲/柏林”)));
}
公共列表getTimes(){
(数据)的返回列表;
}
}
@SpringBootTest(webEnvironment=SpringBootTest.webEnvironment.DEFINED\u端口)
@ActiveProfiles(“测试”)
类应用程序测试{
@试验
void simplestatest(){
List fromRest=WebTestClient.bindToServer().baseUrl(“http://localhost:8080).build()
.get().uri(“/simple”).exchange()
.expectBodyList(SimpleData.class)
.returnResult().GetResponseBy();
assertThat(fromRest).containsAll(Collections.singletonList(SimpleDataService.DATA));
}
}
这与

应为ArrayList: 包含: 但找不到以下元素:

时间本身是正确的-时区差从小时字段中减去-但它显然不符合相等值。有趣的是,如果使用客户端查询url,JSON包含正确的数据:

[{“zdt”:“2020-08-05T11:44:10.4740259+02:00”}]

似乎是
TestWebClient
在转换时间


这是有意的吗?我可以改变这种行为吗?

总之,
仅将日期调整到上下文时区是不够的,
WebTestClient
不应该手动创建,而应该使用
@AutoConfigureWebTestClient
并自动连接客户端

    @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
    @ActiveProfiles("test")
    @AutoConfigureWebTestClient
    class ApplicationTests {

        @Autowired
        private WebTestClient client;
    
        @Test
        void simpleDataTest() {
          List<SimpleData> fromRest = client.
             .get().uri("/simple").exchange()
             .expectBodyList(SimpleData.class)
             .returnResult().getResponseBody();
          assertThat(fromRest)
              .containsAll(singletonList(SimpleDataService.DATA));
       }
    }

如果没有解决办法,我就睡不着。好了,给你!您的问题的有效解决方案。:)

@JsonComponent
类ZonedDateTimeJsonSerializer扩展JsonSerializer{
静态DateTimeFormatter formatter=DateTimeFormatter.ISO_ZONED_DATE_TIME;
@凌驾
公共无效序列化(ZonedDateTime zdt、JsonGenerator、JsonGenerator、,
SerializerProvider SerializerProvider)引发IOException,
JsonProcessingException{
writeString(zdt.format(格式化程序));
}
}
@JsonComponent
类ZonedDateTimeJsonDeserializer扩展了JsonDeserializer{
静态DateTimeFormatter formatter=DateTimeFormatter.ISO_ZONED_DATE_TIME;
@凌驾
公共分区DateTime反序列化(JSONP解析器,反序列化上下文ctxt)
抛出IOException、JsonProcessingException{
返回ZonedDateTime.parse(p.getValueAsString(),格式化程序);
}
}
@SpringBootTest(webEnvironment=SpringBootTest.webEnvironment.DEFINED\u端口)
@ActiveProfiles(“测试”)
@自动配置WebTestClient
类应用程序测试{
@自动连线
私有WebTestClient;//重要!因为必须提取@jsonComponent
@试验
void simplestatest(){
List fromRest=client。
.get().uri(“/simple”).exchange()
.expectBodyList(SimpleData.class)
.returnResult().GetResponseBy();
断言(弗罗斯特)
.containsAll(singletonList(SimpleDataService.DATA));
}
}

这有帮助吗?这是否回答了您的问题@KavithakaranKanapathippillai嗯,看起来是一样的,但是在接受的答案中设置值并不会改变我的行为,只是意识到它不会工作,因为
WebTestClient
是一个手动创建的bean,所以它不知道spring属性,在我的回答中,我最初没有使用autowired客户端并对其进行了更新。它还需要
spring boot starter webflux
依赖项,我假设您现在有itOMG,它包含正确的分区时间,但缺少分区id(欧洲/柏林),因此仍然失败。总之,就是这样,谢谢你。
    spring.jackson.deserialization.ADJUST_DATES_TO_CONTEXT_TIME_ZONE = false
@JsonComponent
class ZonedDateTimeJsonSerializer extends JsonSerializer<ZonedDateTime> {
    static DateTimeFormatter formatter = DateTimeFormatter.ISO_ZONED_DATE_TIME;
    
    @Override
    public void serialize(ZonedDateTime zdt, JsonGenerator jsonGenerator, 
      SerializerProvider serializerProvider) throws IOException, 
      JsonProcessingException {
        jsonGenerator.writeString(zdt.format(formatter));
    }
}

@JsonComponent
class ZonedDateTimeJsonDeserializer extends JsonDeserializer<ZonedDateTime> {
    static DateTimeFormatter formatter = DateTimeFormatter.ISO_ZONED_DATE_TIME;

    @Override
    public ZonedDateTime deserialize(JsonParser p, DeserializationContext ctxt)
            throws IOException, JsonProcessingException {
        return ZonedDateTime.parse(p.getValueAsString(),formatter);
    }
}

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
@ActiveProfiles("test")
@AutoConfigureWebTestClient
class ApplicationTests {

    @Autowired
    private WebTestClient client; // important! as the @jsonComponent has to be picked up

    @Test
    void simpleDataTest() {
      List<SimpleData> fromRest = client.
         .get().uri("/simple").exchange()
         .expectBodyList(SimpleData.class)
         .returnResult().getResponseBody();
      assertThat(fromRest)
          .containsAll(singletonList(SimpleDataService.DATA));
   }
}