Hello all,
I have the following table:
CREATE TABLE userprincipal (
userid timeuuid,
username varchar,
hashedpassword blob,
authorities set<text>,
accountnonexpired boolean,
accountnonlocked boolean,
credentialsnonexpired boolean,
enabled boolean,
PRIMARY KEY(username)
);
Now, I have an UserPrincipalObject to which Authorities ia a HashSet of
UserAuthority Spring objects. If the system does the setting through that
object, I update my own set of Strings called sAuthorities.
On the database I save the sAuthorities which is what I map. But on the
object on the memory I mape the set of UserAuthorities
My UserPrincipalObject is as follows:
@Table(name = "userprincipal")
public class UserPrincipal implements UserDetails, CredentialsContainer,
Cloneable {
@Transient
private static final long serialVersionUID = 1L;
@PartitionKey
@Column(name = "username")
private String userName;
@Column(name = "userid")
private UUID userID;
@Column(name = "hashedpassword")
private ByteBuffer hashedPassword;
@Column(name = "sauthorities")
private Set<String> sAuthorities = new HashSet<String>();
@Transient
@FrozenValue
Set<UserAuthority> authorities = new HashSet<UserAuthority>();
@Column(name = "accountnonexpired")
private boolean accountNonExpired;
@Column(name = "accountnonlocked")
private boolean accountNonLocked;
@Column(name = "credentialsnonexpired")
private boolean credentialsNonExpired;
@Column(name = "enabled")
private boolean enabled;
The setters for both Authorities list is as follows:
Now, note that the set for sAuthorities updates the authorities variable
which is a Set<UserAuthority>
And that the set for authorities updates the Set<String> sAuthority with is
what gets persisted to the table.
So @Column(name = "sauthorities")
private Set<String> sAuthorities = new HashSet<String>();
Also authorities is @Transient annotated.
public Set<String> getsAuthorities() {
return sAuthorities;
}
public void setsAuthorities(Set<String> sAuthorities) {
this.sAuthorities = sAuthorities;
this.authorities = new HashSet<UserAuthority>();
UserAuthority auxAuthor;
for (String a : sAuthorities) {
auxAuthor = new UserAuthority(a);
this.authorities.add(auxAuthor);
}
}
@Override
public Set<UserAuthority> getAuthorities() {
return this.authorities;
}
public void setAuthorities(Set<UserAuthority> authorities) {
this.authorities = authorities;
this.sAuthorities = new HashSet<String>();
for (UserAuthority a : this.authorities) {
this.sAuthorities.add(a.getAuthority());
}
}
However, when I create the mapper I get the following error:
Exception in thread "main" java.lang.IllegalArgumentException: Cannot find
matching getter and setter for field 'sAuthorities'
at
com.datastax.driver.mapping.ReflectionMapper$ReflectionFactory.createColumnMapper(ReflectionMapper.java:375)
at
com.datastax.driver.mapping.AnnotationParser.convert(AnnotationParser.java:148)
at
com.datastax.driver.mapping.AnnotationParser.parseEntity(AnnotationParser.java:100)
at
com.datastax.driver.mapping.MappingManager.getMapper(MappingManager.java:119)
at com.datastax.driver.mapping.MappingManager.mapper(MappingManager.java:76)
Now, note that sAuthorities is properly annotated:
@Column(name = "sauthorities")
private Set<String> sAuthorities = new HashSet<String>();
My mapper code is as follows:
MappingManager manager = new MappingManager(session);
Mapper<UserPrincipal> mapper = manager.mapper(UserPrincipal.class);
mapper.save(principal);
What is going wrong? Do I have to have a special annotation for Set<text>
because I could not find one looking at the source code nor the manual.
Yes for UDTs you have that. Do I have to put that inside an UDT?
Thanks.