Spring Web是否会忽略强类型化Java的规则?

问题描述

考虑以下代码

Foo{ String prop1; String prop2 }
Bar{ String prop1; int prop2 }
@GetMapping("/getFoo")
public Mono<ResponseEntity<Foo>> getFoo() {
        return Mono.just(new Bar("a",1))
                   .map(f -> new ResponseEntity(f,HttpStatus.OK);
    }
@Test
public void test() {
        webTestClient.get()
                     .uri("/getFoo")
                     .exchange()
                     .expectBody(Foo.class)
                     .consumeWith(f -> { assertEquals("a",f.getProp1());});
    }

该测试在我从未创建Foo类型的实体时起作用。 Java是强类型的,我希望在某处发生强制转换错误。我认为Spring Web会进行内省以避免该错误,但这让我感到惊讶。它真的具有Spring Web的功能吗?还是我想念什么?

解决方法

您看到的是JSON序列化/反序列化过程的强制性。默认情况下,Jackson(和其他JSON提供程序)将在处理有效负载时自动将整数与String相互转换。

例如,酒吧的有效载荷为:

{
   "prop1": "a","prop2": 1
}

然后,Jackson(或您的json库,如果您使用其他东西)将在反序列化时将1转换为字符串。

如果您希望这种类型的呼叫失败,可以使用自定义反序列化器禁用此功能。

Disable conversion of scalars to strings when deserializing with Jackson

Disable the Number to String automatic conversion in jackson

您正在进行的调用对基础类一无所知,并且正在与基于字段名称匹配的中间格式进行交互。