JPA 2.2应支持@Inject
中的AttributeConverter
,如规范中所述:
Java EE环境中的属性转换器类通过上下文支持依赖注入 和启用CDI时的依赖注入API(CDI)[7] [51]。属性转换器类 使用CDI注入也可以定义使用PostConstruct注释的生命周期回调方法 和PreDestroy注释。注射后将调用这些方法 在分别销毁属性转换器实例之前和之前。
但是当我将我的JPA 2.1对流样本转换为JPA 2.2时,它不起作用。
original Converter同时适用于Glassfish v4和v5:
@Converter
public class ListToStringConveter implements AttributeConverter<List<String>, String> {
//@Inject Logger log;
@Override
public String convertToDatabaseColumn(List<String> attribute) {
if (attribute == null || attribute.isEmpty()) {
return "";
}
return StringUtils.join(attribute, ",");
}
@Override
public List<String> convertToEntityAttribute(String dbData) {
if (dbData == null || dbData.trim().length() == 0) {
return new ArrayList<String>();
}
String[] data = dbData.split(",");
return Arrays.asList(data);
}
}
为了品尝JPA 2.2中AttributeConverter
的注入支持,我将转换逻辑提取到了另一个CDI bean。并尝试在Glassfish v5(Java EE 8参考实现)中运行代码。
@Converter(autoApply = false)
public class TagsConverter implements AttributeConverter<List<String>, String> {
// private static final Logger LOG = Logger.getLogger(TagsConverter.class.getName());
//
// @Override
// public String convertToDatabaseColumn(List<String> attribute) {
// if (attribute == null || attribute.isEmpty()) {
// return "";
// }
// return String.join( ",", attribute);
// }
//
// @Override
// public List<String> convertToEntityAttribute(String dbData) {
// if (dbData == null || dbData.trim().length() == 0) {
// return new ArrayList<>();
// }
//
// String[] data = dbData.split(",");
// return Arrays.asList(data);
// }
@Inject
Logger LOG;
@Inject
ConverterUtils utils;
@PostConstruct
public void postConstruct(){
LOG.log(Level.INFO, "calling @PostConstruct");
}
@PreDestroy
public void preDestroy(){
LOG.log(Level.INFO, "calling @PreDestroy");
}
@Override
public String convertToDatabaseColumn(List<String> attribute) {
LOG.log(Level.FINEST, "utils injected: {0}", utils != null);
if (attribute == null || attribute.isEmpty()) {
return "";
}
return utils.listToString(attribute);
}
@Override
public List<String> convertToEntityAttribute(String dbData) {
if (dbData == null || dbData.trim().length() == 0) {
return Collections.<String>emptyList();
}
return utils.stringToList(dbData);
}
}
ConverterUtils
上课。
@ApplicationScoped
public class ConverterUtils {
public String listToString(List<String> tags) {
return join(",", tags);
}
public List stringToList(String str) {
return Arrays.asList(str.split(","));
}
}
在TagsConverter
中,未注入预期的ConverterUtils
,并且在调用它时始终为null,NPE抛出。
可以找到完整的代码here。
更新:我发现4年前我创建了an issue on EclipseLink bugzilla。