3

I have a existing Model and want to use it with Picketlink. But I am using Long as @Id field. But Picketlink expect this to be a String field. I have found some hints to use another entity which maps to the corresponding entity of my model. But actually I don't now how to do it.

I have a base class, which all entities derive from:

@MappedSuperclass
public abstract class AbstractEntity implements Serializable, Cloneable {
    @Id
    @Identifier
    @Column(name = "SID")
    private Long sid;

    @Column(name = "INSERT_TIME")
    private Date insertTime;

    @Column(name = "UPDATE_TIME")
    private Date updateTime;

    // getters and setters
}

And a derived realm entity:

@Entity
@IdentityManaged(Realm.class)
public class RealmEntity extends AbstractEntity {
    @AttributeValue
    private String name;

    @PartitionClass
    private String typeName;

    @ConfigurationName
    private String configurationName;

    @AttributeValue
    private boolean enforceSSL;

    @AttributeValue
    private int numberFailedLoginAttempts;

    // getters and setters
}

And the mapping class for Picketlink looks as follows:

@IdentityPartition(supportedTypes = {
    Application.class,
    User.class,
    Role.class
})
public class Realm extends AbstractPartition {
    @AttributeProperty
    private boolean enforceSSL;

    @AttributeProperty
    private int numberFailedLoginAttempts;

    private Realm() {
        this(null);
    }

    public Realm(String name) {
        super(name);
    }
}

The PartitionManager is defined as follows:

builder
    .named("default.config")
    .stores()
    .jpa()
    .supportType(User.class, Role.class, Application.class, Realm.class)
    .supportGlobalRelationship(Grant.class, ApplicationAccess.class)
    .mappedEntity(App.class, AppUserRole.class, AppRole.class, AppUser.class, UserEntity.class, RelationshipIdentityTypeEntity.class, RealmEntity.class)
    .addContextInitializer((context, store) -> {
        if (store instanceof JPAIdentityStore) {
            if (!context.isParameterSet(JPAIdentityStore.INVOCATION_CTX_ENTITY_MANAGER)) {
                 context.setParameter(JPAIdentityStore.INVOCATION_CTX_ENTITY_MANAGER, entityManager);
            }
        }
    });

When I try to create a new Realm Hibernate throws an error while trying to load the Realm because the @Id is defined as Long but the @Identifier of the Picketlink model is a String.

this.shsRealm = new Realm(REALM_SHS_NAME);
this.shsRealm.setEnforceSSL(true);
this.shsRealm.setNumberFailedLoginAttempts(3);

this.partitionManager.add(this.shsRealm);

java.lang.IllegalArgumentException: Provided id of the wrong type for class de.logsolut.common.picketlink.model.RealmEntity. Expected: class java.lang.Long, got class java.lang.String

How can I map the JPA model correctly to Picketlink?

Georg Leber
  • 3,470
  • 5
  • 40
  • 63
  • Have you looked into Keycloak? Looks like Picketlink is going to be deprecated/superseded by Keycloak: http://picketlink.org/keycloak-merge-faq/ – Julie Jan 26 '18 at 18:54

0 Answers0