У меня есть простая реализация AttributeConverter
, в которой я пытаюсь ввести объект, который должен обеспечить логику преобразования, но @Inject
, похоже, не работает для этого случая. Класс конвертер выглядит следующим образом:@Inject не работает в AttributeConverter
@Converter(autoApply=false)
public class String2ByteArrayConverter implements AttributeConverter<String, byte[]>
{
@Inject
private Crypto crypto;
@Override
public byte[] convertToDatabaseColumn(String usrReadable)
{
return crypto.pg_encrypt(usrReadable);
}
@Override
public String convertToEntityAttribute(byte[] dbType)
{
return crypto.pg_decrypt(dbType);
}
}
Когда @Converter
срабатывает он бросает NullPointerException
, поскольку свойство crypto
не инициализируется из контейнера. Почему это?
Я использую Glassfish 4, а во всех остальных случаях @Inject
работает просто отлично.
Невозможно использовать CDI на конвертерах?
Любая помощь будет оценена :)
Акцентом мой вопрос больше AttributeConverter часть. Я понимаю, что для работы CDI bean-компонент должен соответствовать условиям, описанным здесь http://docs.oracle.com/javaee/6/tutorial/doc/gjfzi.html. я также пытался заставить CDI работать, реализуя следующий конструктор:
@Inject
public String2ByteArrayConverter(Crypto crypto)
{
this.crypto = crypto;
}
И теперь я получил следующее исключение, которое не дает мне никакого понятия:
2015-07-23T01:03:24.835+0200|Severe: Exception during life cycle processing
org.glassfish.deployment.common.DeploymentException: Exception [EclipseLink-28019] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.EntityManagerSetupException
Exception Description: Deployment of PersistenceUnit [PU_VMA] failed. Close all factories for this PersistenceUnit.
Internal Exception: Exception [EclipseLink-7172] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.ValidationException
Exception Description: Error encountered when instantiating the class [class model.converter.String2ByteArrayConverter].
Internal Exception: java.lang.InstantiationException: model.converter.String2ByteArrayConverter
at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.createDeployFailedPersistenceException(EntityManagerSetupImpl.java:820)
at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:760)
...
Я даже пытался используя @Producer или @Decorator для того, чтобы CDI работал на этом месте, но я все еще думаю, что есть что-то конкретное с AttributeConverter, который не позволяет CDI. Так проблема еще не решена.
Возможно, дубликат: http://stackoverflow.com/questions/12080317/inject-only-working-for-pojos-created-by-cdi-container – MWiesner
Частично это дубликат, но есть особенность Spring решение, которое не работает для меня, так как я не использую Spring. Я расширил описание своего дела некоторым новым опытом, но проблема все еще не решена. – Svetoslav