繁体   English   中英

在@RequestBody 中使用 spring 转换器

[英]Using spring converter in @RequestBody

是否可以强制转换器(org.springframework.core.convert.converter.Converter)完成 json object 映射?

Json 代码示例:

{
 "name": "somename",
 "customObject": id
}

其中 somename - 字符串,id - integer 值

映射到:

@Getter
@Setter
@NoArgConstructor
public class ParentObject{
    private String name;
    private CustomObject customObject; 
}

转换器代码示例:

@Component
public class CustomObjectConverter implements Converter<String, CustomObject>{

    @Autowired
    private CustomObjectService customObjectService;

    @Override
    public CustomObject convert(String arg0) {
        Long id = Long.parseLong(arg0);
        return customObjectService.findById(id);
    }   
}

我想要实现的是 map,json 到 object,它将自动从嵌套的 object 中获取。

你应该实现自己的JacksonCustomMapper ,通过扩展JsonMapper ,然后登记入组的HttpMessageConverters 但是,我不建议污染默认转换,您可以在@RequestBody传递一个不完整的 json,Jackson 会将其解析为您的对象,在您的 json 对象中不传递错误的键就足够了......一个例子(成千上万)在这里: http : //magicmonster.com/kb/prg/java/spring/webmvc/jackson_custom.html 好好享受 :-)

我认为有更好的方法来解决这个问题。 您只需要再添加一个实现:

com.fasterxml.jackson.databind.util.Converter

并在您的 object 上添加注释:

import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
...
@JsonDeserialize(converter = CustomObjectConverter.class)
private CustomObject customObject; 

因此,您的代码将如下所示。 Model:

@Getter
@Setter
@NoArgConstructor
public class ParentObject{
   private String name;

   @JsonDeserialize(converter = CustomObjectConverter.class)
   private CustomObject customObject; 
}

转换器:

@Component
public class CustomObjectConverter implements 
  org.springframework.core.convert.converter.Converter<String, CustomObject>, 
  com.fasterxml.jackson.databind.util.Converter<String, CustomObject>{

   @Autowired
   private CustomObjectService customObjectService;

   @Override
   public CustomObject convert(String arg0) {
       Long id = Long.parseLong(arg0);
       return customObjectService.findById(id);
   }

   @Override
   public JavaType getInputType(TypeFactory typeFactory) {
       return typeFactory.constructType(String.class);
   }

   @Override
   public JavaType getOutputType(TypeFactory typeFactory) {
       return typeFactory.constructType(CustomObject.class);
   }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM