【问题标题】:Jackson JSON library: how to instantiate a class with abstract fields that can't access its concrete representation?Jackson JSON 库:如何使用无法访问其具体表示的抽象字段实例化一个类?
【发布时间】:2013-11-19 17:41:40
【问题描述】:

这与以下问题相同:

Jackson JSON library: how to instantiate a class that contains abstract fields

尽管如此,它的解决方案是不可能的,因为我的抽象类在另一个项目中,而不是具体的。

那有办法吗?

编辑

我的架构如下:

public class UserDTO {

    ...
    private LanguageDTO lang;

}

我发送那个对象用户:

restTemplate.postForObject(this.getHttpCore().trim() + "admin/user/save/1/" + idUser, userEntity, UserDTO.class);

那么我应该在函数中接收它:

 @RequestMapping(value = "/save/{admin}/{idUser}", method = RequestMethod.POST)
    public String saveUserById(@RequestBody final UserEntity user, @PathVariable Integer idUser, @PathVariable boolean admin)

将 UserEntity 定义为:

public class UserEntity extends AbstractUserEntity {
    ...

}

public abstract class AbstractUserEntity {

    ...
    private AbstractLanguageEntity lang;
}

我想知道如何指定 lang 应该实例化为 LanguageEntity 而抽象类在另一个项目中。

【问题讨论】:

    标签: java json jackson abstract resttemplate


    【解决方案1】:

    假设您可以配置对象的序列化方式,这可能会起作用。请参阅示例here。查看“1.1. 全局默认类型”以设置默认值以在 JSON 字符串中包含额外信息,基本上是反序列化时必须使用的具体 Java 类型。

    由于您似乎需要为您的 Spring servlet 执行此操作,因此您必须传递一个 Spring 消息转换器,如提到的 here

    然后在你自定义的objectMapper里面,你可以做必要的配置:

    public class JSONMapper extends ObjectMapper {    
        public JSONMapper() {
            this.enableDefaultTyping();
        }    
    }
    

    你也可以让它与 Mix-ins 一起工作,它允许你为已经定义的类添加注释。您可以查看示例here。这也需要在 objectMapper 中进行配置。

    如果您在客户端需要相同的功能(REST 模板),您可以传递对象映射器,如 here 所示。

    【讨论】:

    • 很抱歉,鉴于我的上下文,我不知道该怎么做。我更新了我的问题以提供更多详细信息。
    【解决方案2】:

    解决该问题的最简单方法是在 UserEntity 中添加 getter 和 setter,但指定一个具体的类:

    public LanguageEntity getLang() {
       return (LanguageEntity) lang;
    }
    
    public void setLang(LanguageEntity language){
       this.lang = language
    }
    

    【讨论】:

      【解决方案3】:

      如果你只想注意到LanguageEntityAbstractLanguageEntity的实现,你可以通过模块注册这个映射:

      SimpleModule myModule = new SimpleModule())
        .addAbstractTypeMapping(AbstractLanguageEntity.class,
          LanguageEntity.class);
      ObjectMapper mapper = new ObjectMapper()
         .registerMdoule(myModule);
      

      【讨论】:

        猜你喜欢
        • 2011-07-26
        • 2015-07-29
        • 1970-01-01
        • 2018-11-16
        • 2011-03-20
        • 2015-10-06
        • 1970-01-01
        • 2015-08-04
        • 1970-01-01
        相关资源
        最近更新 更多