如何将 @RequestBody 映射到 Java 实现构建器模式的对象

How to map @RequestBody to Java Object implementing Builder Pattern

我正在使用从其他实现构建器模式的服务导入的域对象,因此没有无参数构造函数和设置器。我想将来自 @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);
}

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

我从未尝试过,但一般来说 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();
    }

}

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

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