gpt4 book ai didi

java - 如何将 @RequestBody 映射到实现 Builder 模式的 Java 对象

转载 作者:行者123 更新时间:2023-12-04 14:10:21 26 4
gpt4 key购买 nike

我正在使用从其他实现构建器模式的服务导入的域对象,因此没有无参数构造函数和 setter 。我想将来自 @RequestBody 的 JSON 映射到这个域对象。我知道我可以用 @JSONPojoBuilder 和其他一些注释它,但我无法控制它。所以我坚持将自己的 JSON 写入对象映射器,我认为这不是一个好主意,因为它涉及验证等,并且与请求正文紧密耦合。

代码-

@RequestMapping(value = "someurl", method = RequestMethod.POST)
public ResponseEntity<ObjectA> addObject(@PathVariable String id, @RequestBody @NonNull String body) {
ObjectA obj = service.addObject(id, mapper.mapJSONToObject(body));
return new ResponseEntity<>(obj , HttpStatus.CREATED);
}

我听说我们可以使用一些消息转换器并将我们的 Builder 类作为一些参数传递,而不是自己编写映射器。我没有找到这样的例子,如果有人以前做过或者可以指点我一些网站,那会很有帮助。

最佳答案

我从未尝试过,但通常 Spring MVC 支持您可以编写的“自定义转换器”的抽象,以帮助 spring 将 JSON 转换为复杂的对象。

我假设您有一个 MyComplicatedClass 没有无操作构造函数但有一个构建器。因此,您可以执行以下操作:

import org.springframework.core.convert.converter.Converter;

@Component // note the converter is also a spring bean so you can, say, inject object mapper and convert to JsonNode-s for example (see below)
public class MyComplicatedClassConverter implements Converter<String, MyComplicatedClass> {
@Autowired // or use constructor injection
private ObjectMapper objectMapper;
/**
* Override the convert method
* @param object in a string representation to be converted
* @return
*/
@Override
public MyComplicatedClass convert(String object) {
JsonNode node= objectMapper.readTree(/*byte array input stream from object string or something */);

return MyComplicatedClass.builder()
.withSomeProperty(node.get("someProperty").textValue()
.withAnotherProperty(node.get("anotherProperty").intValue()
.build();
}

}

现在,当您的应用程序识别此转换器时,它允许在 Controller 的方法中使用 MyComplicatedClass,就好像 spring 知道如何转换它一样。因此,您在示例中提供的代码片段应该有效。

所有这些都是在不“触及”MyComplicatedClass 的代码的情况下完成的。

关于java - 如何将 @RequestBody 映射到实现 Builder 模式的 Java 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64998426/

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