微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。