Jackson JSON库:如何使用无法访问其具体表示的抽象字段来实例化一个类?

时间:2013-11-19 17:41:40

标签: java json jackson abstract resttemplate

这与以下问题相同:

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,而抽象类则在另一个项目中。

3 个答案:

答案 0 :(得分:0)

这可以用来假设您可以配置对象的序列化方式。请参阅示例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所示传递对象映射器。

答案 1 :(得分:0)

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

public LanguageEntity getLang() {
   return (LanguageEntity) lang;
}

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

答案 2 :(得分:0)

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

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