Не удалось получить экземпляр из нуля — PicketLink

Мы получаем эту ошибку:

[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();
    }

}

person quarks    schedule 28.05.2014    source источник
comment
И можно увидеть в трассировке: [ОШИБКА] Причина: java.lang.Throwable: PLIDM000404: Не удалось загрузить раздел для типа [interface org.picetlink.idm.model.Partition] и имени [не указано].   -  person quarks    schedule 28.05.2014


Ответы (1)


Проверьте свою базу данных, есть ли запись для 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");
            }
    }
    }
person user3749223    schedule 25.08.2014
comment
Привет, столкнулся с этой же проблемой и вручную добавил указанный тип раздела по умолчанию в таблицу. Вот что у меня есть в БД: hastebin.com/qifiweganu.rb Но все равно получаю ошибку PLIDM000404: Could not load partition for type [class org.picketlink.idm.model.basic.Realm] and name [default]. Как следует ли добавить значение в таблицу БД? - person nemesisfixx; 26.02.2015
comment
У меня не было возможности более глубоко изучить, что именно ему нужно. В моем файле persistence.xml я установил схему для автоматического создания, чтобы пикетная ссылка создавала таблицы для меня. и тогда вам нужно иметь какую-то функцию инициализации, прежде чем вы сможете что-то использовать. Я думаю, что это пришло из одного из быстрых стартов, которые у них есть. - person user3749223; 06.03.2015