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