gpt4 book ai didi

json - 在 Controller 中为每个 RequestMapping 配置不同的 FAIL_ON_UNKNOWN_PROPERTIES

转载 作者:行者123 更新时间:2023-12-04 13:17:53 34 4
gpt4 key购买 nike

我想在 Controller 中的不同 @RequestMapping 上以不同方式处理 json 到对象的转换。

我相信如果我们在 spring-boot 项目中添加 Jackson 依赖项,它会处理 json 到 Object 的转换,并且 #spring.jackson.deserialization.fail-on-unknown-properties=true 属性将确保如果 json 中存在一些未知属性,转换将失败(如果我错了,请纠正我)。

我们能否在本地告诉 jackson 何时在未知属性上失败以及何时忽略这些属性。

以下是使用标志的代码片段。

    @GetMapping(value = "sample")
public @ResponseBody UserDTO test(@RequestParam String str, @RequestParam boolean failFast) {
ObjectMapper map = new ObjectMapper();
if( failFast) {
map.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, true);
} else {
map.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
}
UserDTO userDTO = null;
try {
userDTO = map.readValue(str, UserDTO.class);
} catch (IOException e) {
e.printStackTrace();
}
return userDTO;
}

我不需要像使用 @RequestParam 那样在运行时处理它。是否有一些属性可以用来标记映射,在哪里检查未知属性以及在哪里忽略它们。

编辑:我正在寻找的是更改现有应用程序以处理每个映射的未知属性。例如:

        @PostMapping(value = "fail/fast")
public @ResponseBody UserDTO test(@FAIL_ON_UNKNOWN @RequestBody UserDTO userDTO, @RequestParam boolean failFast) {
..///processing...
return userDTO;
}

@PostMapping(value = "fail/safe")
public @ResponseBody UserDTO test( @RequestBody UserDTO userDTO, @RequestParam boolean failFast) {
..///processing...
return userDTO;
}

如果可以为每个映射添加一些验证之王,那么我不需要更改所有现有映射来自定义未知属性,并且代码更改将最少。

最佳答案

JacksonObjectMapper 允许您使用自定义配置创建新的 ObjectReader。您可以在您的应用程序中创建一个通用的 ObjectMapper 实例,并且对于某些 Controller ,将其用作创建自定义阅读器的基础对象。它将允许您使用所有常用功能和注册模块,并在需要时进行少量更改。见下面的 Controller :

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectReader;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StringWriter;
import java.util.Objects;

@RestController
@RequestMapping(value = "/options")
public class JacksonOptionsController {

private final ObjectMapper objectMapper;

@Autowired
public JacksonOptionsController(ObjectMapper objectMapper) {
this.objectMapper = Objects.requireNonNull(objectMapper);
}

@PostMapping(path = "/fail")
public ResponseEntity<String> readAndFastFail(HttpServletRequest request) throws IOException {
String json = readAsRawJSON(request);
Payload payload = createFailFastReader().readValue(json);

return ResponseEntity.ok("SUCCESS");
}

@PostMapping(path = "/success")
public ResponseEntity<String> readAndIgnore(HttpServletRequest request) throws IOException {
String json = readAsRawJSON(request);
Payload payload = createSafeReader().readValue(json);

return ResponseEntity.ok("SUCCESS");
}

private ObjectReader createFailFastReader() {
return objectMapper
.readerFor(Payload.class)
.with(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
}

private ObjectReader createSafeReader() {
return objectMapper
.readerFor(Payload.class);
}

private String readAsRawJSON(HttpServletRequest request) throws IOException {
try (InputStreamReader reader = new InputStreamReader(request.getInputStream())) {
try (StringWriter out = new StringWriter(64)) {
reader.transferTo(out);
return out.toString();
}
}
}
}

Payload 类只有一个属性 - id。在一个 Controller 中,我们使用启用了 DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIESObjectReader。在其他情况下,我们使用默认配置的 ObjectReader 禁用 DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES

对于测试请求:

curl -i -X POST -H 'Content-Type: application/json' -H 'Accept: application/json' -d '{"id":"some-value","id1":1}' http://localhost:8080/options/fail

应用程序抛出异常并请求:

curl -i -X POST -H 'Content-Type: application/json' -H 'Accept: application/json' -d '{"id":"some-value"}' http://localhost:8080/options/fail

它返回 SUCCESS 值。当我们在 http://localhost:8080/options/success URL 上发送上述两个 payload 时,app 在这两种情况下都会返回 SUCCESS 值。

另见:

关于json - 在 Controller 中为每个 RequestMapping 配置不同的 FAIL_ON_UNKNOWN_PROPERTIES,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58291233/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com