java 在特定控制器的JSON请求主体中返回未知字段的错误

lsmepo6l  于 2023-02-02  发布在  Java
关注(0)|答案(1)|浏览(170)

我有一个SpringBoot应用程序X,它有面向客户的API,这些API接收JSON格式的请求主体。
应用X向应用Y发出API调用,并接收具有JSON主体的响应。
我想防止应用程序X在面向客户的控制器上接收请求主体中的未知字段。
我考虑的是spring.jackson.deserialization.fail-on-unknown-properties=true,但如果我理解正确,如果应用X对应用Y的调用将返回具有未知字段的响应主体,则这种配置也会导致失败。因此,这种配置将使应用X和应用Y之间的API耦合度更高,鲁棒性更差。

我正在寻找一种方法,仅针对应用程序的面向客户的控制器上的请求主体的反序列化强制执行“fail-on-unknown-fields”,同时允许应用程序其他部分的反序列化忽略未知字段

示例:我有以下面向客户的API。

@PostMapping
public Response updateProduct(@RequestBody Product product) {
.....
}

地点

class Product {
    private int id;
    private String name;
    private int price;
}

我想防止客户通过以下体要求,因为颜色不是一个已知的领域。

{
  "id": 777,
  "name": "apple",
  "price": 2,
  "colour": "red"
}

但是,我希望它的“失败未知字段”将只在这个控制器上执行,而不是在其他地方Jackson是用来反序列化从其他应用程序接收的响应。

a8jjtwal

a8jjtwal1#

您可以在控制器中创建一个新的ObjectMapper示例,显式地将其DeserializationFeature#FAIL_ON_IGNORED_PROPERTIES配置为true值,这样在post请求主体中的json内存在未知属性的情况下强制失败,如下所示:

@PostMapping(value = "/updateproduct")
public Product updateProduct(@RequestBody String productString) throws JsonProcessingException {
    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.configure(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES, true);
    //it will fail in case of unknown properties inside the json string
    Product product = objectMapper.readValue(productString, Product.class);
    return product;
}

选择将请求主体json转换为String,您可以手动配置您的ObjectMapper本地示例,同时您必须决定在出现json处理异常(在我的示例中,我只是决定直接抛出异常,但可以采用不同的行为)或UnrecognizedPropertyException异常(如您所展示的示例)时如何继续。

相关问题