这与以下问题相同:
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,而抽象类则在另一个项目中。
答案 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)
如果你想要实现的只是注意LanguageEntity
是AbstractLanguageEntity
的实现,你可以通过模块注册这个映射:
SimpleModule myModule = new SimpleModule())
.addAbstractTypeMapping(AbstractLanguageEntity.class,
LanguageEntity.class);
ObjectMapper mapper = new ObjectMapper()
.registerMdoule(myModule);