Мы получаем эту ошибку:
[ERROR] Caused by: java.lang.Throwable: WELD-000044 Unable to obtain instance from null
[ERROR] at org.jboss.weld.bean.builtin.CallableMethodHandler.invoke(CallableMethodHandler.java:48)
[ERROR] at org.jboss.weld.bean.proxy.EnterpriseTargetBeanInstance.invoke(EnterpriseTargetBeanInstance.java:56)
[ERROR] at org.jboss.weld.bean.proxy.ProxyMethodHandler.invoke(ProxyMethodHandler.java:105)
[ERROR] at org.jboss.weldx.persistence.EntityManager$1841842027$Proxy$_$$_Weld$Proxy$.getCriteriaBuilder(EntityManager$1841842027$Proxy$_$$_Weld$Proxy$.java)
[ERROR] at org.picketlink.idm.jpa.internal.JPAIdentityStore.getPartitions(JPAIdentityStore.java:298)
[ERROR] at org.picketlink.idm.jpa.internal.JPAIdentityStore.get(JPAIdentityStore.java:290)
[ERROR] at org.picketlink.idm.internal.DefaultPartitionManager.getPartitions(DefaultPartitionManager.java:325)
[ERROR] ... 80 more
И, исследуя, я вижу, что это основная причина:
DefaultPartionManager.java
Метод, который вызывает ошибку:
public <T extends Partition> List<T> getPartitions(Class<T> partitionClass)
Вот:
throw MESSAGES.partitionGetFailed(partitionClass, "not specified", e);
Однако я смущен этой ошибкой, когда мы установили PartitionTypeEntity.class в IDMConfiguration.java:
@ApplicationScoped
public class IDMConfiguration {
@Inject
private EEJPAContextInitializer contextInitializer;
private IdentityConfiguration identityConfig = null;
@Produces
IdentityConfiguration createConfig() {
if (identityConfig == null) {
initConfig(null);
}
return identityConfig;
}
public void configureIdentityManagement(@Observes IdentityConfigurationEvent event) {
initConfig(event.getConfig());
}
public void initConfig(IdentityConfigurationBuilder builder){
if (builder == null){
builder = new IdentityConfigurationBuilder();
}
builder.named("default" + "").stores().jpa().mappedEntity(
AccountTypeEntity.class,
RoleTypeEntity.class,
GroupTypeEntity.class,
IdentityTypeEntity.class,
RelationshipTypeEntity.class,
RelationshipIdentityTypeEntity.class,
PartitionTypeEntity.class,
PasswordCredentialTypeEntity.class,
AttributeTypeEntity.class)
//UserImpl.class)
.supportGlobalRelationship(Relationship.class)
.addContextInitializer(this.contextInitializer)
.setCredentialHandlerProperty(PasswordCredentialHandler.SUPPORTED_ACCOUNT_TYPES_PROPERTY, UserImpl.class)
.supportAllFeatures();
identityConfig = builder.build();
}
}
Проверьте свою базу данных, есть ли запись для "Default" PartitionTypeEntity? Я думаю, вы должны проверить, существует ли он до того, как вы начнете его использовать. Предполагается, что Picketlink автоматически создает раздел по умолчанию в первый раз, когда вы его используете, но я думаю, иногда он не делает этого для вас. Для меня, в IDMInitializer
, мне пришлось проверить, был ли сначала раздел "по умолчанию", и если этого не было, мне пришлось создать новый Realm()
прежде чем я начну использовать приложение.
@Singleton
@Startup
public class IDMInitializer{
@Inject
private PartitionManager partitionManager;
@PostConstruct
public void init(){
Realm defaultReam = this.partitionManager.getPartition(Realm.class, "default");
if (defaultReam==null){
System.out.println("Couldn't find default partition, creating default partition");
defaultRealm = new Realm("default");
this.partitionManager.add(defaultRealm);
} else {
System.out.println("Found default partition");
}
}
}
PLIDM000404: Could not load partition for type [class org.picketlink.idm.model.basic.Realm] and name [default].
Как добавить значение в таблицу БД?