Java 无法从null获取实例-PicketLink

Java 无法从null获取实例-PicketLink,java,picketlink,Java,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.Enterpr

我们得到了以下错误:

[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)
但是,当我们在IDMConfiguration.java中设置PartitionTypeEntity.class时,我对这个错误感到困惑:

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

}

检查数据库,是否有“默认”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");
            }
    }
    }

并且可以在跟踪中看到:java.lang.Throwable:PLIDM000404导致的:[错误]:无法为类型[interface org.picketlink.idm.model.partition]和名称[not specified]加载分区。您好,遇到了相同的问题,并继续手动将所述“默认”分区类型添加到表中。下面是我在db中看到的内容:但仍然出现错误
PLIDM000404:无法为类型[class org.picketlink.idm.model.basic.Realm]和名称[default]加载分区。
该如何将值添加到db表中?我还没有机会深入了解它到底需要什么。在persistence.xml中,我将模式设置为自动生成,以便picket-link为我创建表。然后你需要有一些初始化函数才能使用这些东西。我想这是他们的一个快速入门。
    @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");
            }
    }
    }