【问题标题】:Using spring converter in @RequestBody在@RequestBody 中使用弹簧转换器
【发布时间】:2016-03-25 12:16:12
【问题描述】:

是否可以强制Converter(org.springframework.core.convert.converter.Converter)完成json对象映射?

Json 代码示例:

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

其中 somename - 字符串,id - 整数值

映射到:

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

我想要实现的是将该 json 映射到将自动从 db 嵌套对象中获取的对象。

【问题讨论】:

  • 我认为在转换器内部使用 db 调用不是一个好主意。但要回答您的问题,您只需要在 jackson 中使用 ObjectMapper 将 json 字符串转换为 json 对象
  • 你的评论让我很感兴趣,它可能跑题了,但我很好奇从转换器组件调用服务有什么问题。在这样的流程中我找不到任何危险的地方。

标签: java json spring spring-mvc jackson


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    com.fasterxml.jackson.databind.util.Converter
    

    并在您的对象上添加注释:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多