【发布时间】:2018-11-30 15:57:50
【问题描述】:
我正在处理一个我最初没有创建的项目,其中数据存储在内存中。我目前正在将这些数据移动到数据库中。我正在使用hibernate和tapestry JPA来做到这一点。在项目中的某个时候,通过@JsonDeserialize 注释使用了Jackson 反序列化(实际上与UI 相关联,但我怀疑这是否相关)和反序列化器类(我们称之为DefinitionDeserializer)。 DefinitionDeserializer 然后创建数据库表 (D_DEFINITION) 的 POJO 表示的实例(我们称之为 Definition)。但是,D_DEFINITION 连接到另一个表 (D_TYPE)(因此还有另一个 POJO (PeriodType))。为了解决这个连接,我使用了一个挂毯服务(ConnectingService),我通常通过@Inject注解注入它。但是,当通过 new 关键字创建对象(我试图在其中注入服务,即 DefinitionDeserializer)时,我不能使用这种注入方法 - @987654333 似乎就是这种情况@注解。如果不通过@Inject 关键字注入,我也无法使用ConnectingService,因为那时我也无法在ConnectingService 中注入任何其他服务,我目前正在这样做。
我希望这个描述不会让您太困惑,我无法与您分享实际代码,而且我认为最小的示例不会更好,因为这是一个相当复杂的案例,并且不会t 是这么小的一段代码。但是,如果您需要,我可以尝试提供。
基本上,我需要一种方法告诉JsonDeserialize 采用挂毯服务,而不是创建DefinitionDeserializer 本身的实例。
编辑:类作为例子:
public DefinitionDeserializer extends StdDeserializer<Definition> {
private static final long serialVersionUID = 1L;
//TODO: The injection doesn't work yet
@Inject
private ConnectingService connectingService;
public DefinitionDeserializer() {
this(null);
}
public DefinitionDeserializer(Class<?> vc) {
super(vc);
}
@Override
public Definition deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
Definition pd = new Definition();
JsonNode node = p.getCodec().readTree(p);
if (node.has("type"))
pd.setType(periodTypeDao.findByValue("PeriodType." + node.get("type").asText()));
return pd;
}
}
@Entity
@Table(name = Definition.TABLE_NAME)
@Cacheable
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE, region =
JpaEntityModelConstants.CACHE_REGION_ADMINISTRATION)
public class Definition {
public static final String TABLE_NAME = "D_DEFINITION";
private static final long serialVersionUID = 389511526676381027L;
@Id
@SequenceGenerator(name = JpaEntityModelConstants.SEQUENCE_NAME, sequenceName = JpaEntityModelConstants.SEQUENCE_NAME, initialValue = 1, allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = JpaEntityModelConstants.SEQUENCE_NAME)
@Column(name = "ID")
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumns({
@JoinColumn(name = "FK_TYPE", referencedColumnName = "ID")}
)
private PeriodType type;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public PeriodType getType() {
return type;
}
public void setType(PeriodType dpmType) {
this.type = dpmType;
}
//More columns
}
PeriodType 看起来与Definition 几乎相同。
//BaseService contains all the standard methods for tapestry JPA services
public interface ConnectingService extends BaseService<PeriodType> {
}
public class ConnectingServiceImpl extends BaseServiceImpl<PeriodType> implements ConnectingService {
public ConnectingServiceImpl() {
super (PeriodType.class);
}
}
目前我正在这样使用它(这不起作用):
@JsonDeserialize(using = DefinitionDeserializer.class)
@JsonSerialize(using = DefinitionSerializer.class)
private Definition definition;
【问题讨论】:
-
一个代码示例肯定会有所帮助。
-
@Christine 我编辑了我的问题
标签: java json hibernate jackson tapestry