spring 严格验证Sping Boot 请求正文中的DTO

1l5u6lss  于 2023-02-11  发布在  Spring
关注(0)|答案(2)|浏览(148)

我有一个这样的Sping Boot RestController

public class MyRestController{

 @RequestMapping(value = "/resources", method = RequestMethod.POST,
            produces = MediaType.APPLICATION_JSON_VALUE)
    @ApiResponses(value = { @ApiResponse(code = 201, message = "Created",
            response = Resource.class) })
    @ResponseStatus( HttpStatus.CREATED )
    public Resource createResource(@RequestBody Resource res){
}

@JsonIgnoreProperties(ignoreUnknown = false)
public class Resource{
  private String resourceName;
  private int value;
}

当我传递这样的json时:

{
   "unknownProperty": "test",
   "value::100
}

我希望在设置@JsonIgnoreProperties(ignoreUnknown = false)后抛出一个异常,但这并没有发生。

jyztefdp

jyztefdp1#

据我所知,被忽略的属性意味着被默默忽略。如果你特别想在你不希望看到的属性上抛出异常,那么就创建一个自定义的反序列化器,并要求你的类型用它来序列化。
@JsonDeserialize(using = MyCustomDeserializer.class)(在您的类型上)。
我认为您的自定义反序列化器需要扩展JsonDeserializer<MyType>
要获得您正在寻找的反序列化失败,您需要覆盖deserialize(),并在其中创建一个对象Map器,然后按如下所示配置它。
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, true);

vhipe2zx

vhipe2zx2#

是否可以添加一个bean来配置ObjectMapper:

@Bean
public ObjectMapper objectMapper() {
    ObjectMapper om = new ObjectMapper();
    om.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, true);
    return om;
}

相关问题