如何将@requestbodyMap到实现builder模式的java对象

yftpprvb  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(502)

我使用的域对象是从其他实现生成器模式的服务导入的,因此没有arg构造函数和setter。我想把来自@requestbody的jsonMap到这个域对象。我知道我可以用@jsonpojobuilder和一些其他的注解它,但是我不能控制它。所以我一直坚持写我自己的json到对象Map器,我不认为这是一个好主意,因为它涉及验证等,并与请求体紧密耦合。
代码-

@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);
}

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

hyrbngr7

hyrbngr71#

我从未尝试过,但一般来说,springmvc支持“自定义转换器”的抽象,您可以编写这些抽象来帮助spring将json转换为复杂对象。
我想你有 MyComplicatedClass 没有ops构造器但是有一个构造器。因此,您可以执行以下操作:

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 .

相关问题