2015-09-26 17 views
3

所以我想在sha265密码保存到蒙戈db和为了使用Apache Shiro框架授权用户登录,而试图从DB我拉“M越来越吗啡运行时异常,这里是代码:无法从蒙戈拉分贝使用吗啡 - 没有可用的构造

用户等级:

public class User implements Serializable{ 

     @Id 
     private ObjectId id; 
     private String name; 
     private String password; 
     private SimpleByteSource passwordSalt; 

     @Embedded 
     private TenantId tenantId; 
     private Set<String> roles = new HashSet<>(); 



     @Override 
     public String toString() { 
      return "User [id=" + id + ", name=" + name + ", password=" 
        + password + ", passwordSalt=" + passwordSalt 
        + ", tenantId=" + tenantId + ", roles=" + roles + "]"; 
     } 
     public SimpleByteSource getPasswordSalt() { 
      return passwordSalt; 
     } 
     public void setPasswordSalt(SimpleByteSource passwordSalt) { 
      this.passwordSalt = passwordSalt; 
     } 
     public ObjectId getId() { 
      return id; 
     } 
     public void setId(ObjectId id) { 
      this.id = id; 
     } 
     public String getName() { 
      return name; 
     } 
     public void setName(String name) { 
      this.name = name; 
     } 
     public String getPassword() { 
      return password; 
     } 
     public void setPassword(String password) { 
      this.password = password; 
     } 
     public TenantId getTenantId() { 
      return tenantId; 
     } 
     public void setTenantId(TenantId tenantId) { 
      this.tenantId = tenantId; 
     } 
     public Set<String> getRoles() { 
      return roles; 
     } 
     public void setRoles(Set<String> roles) { 
      this.roles = roles; 
     } 

} 

测试类:

public static void main(String[] args) { 
     MongoClient m_mongoClient = new MongoClient("127.0.0.1",27017); 
     Morphia m_morphiaMongoDB = new Morphia(); 
     Datastore ds = m_morphiaMongoDB.createDatastore(m_mongoClient, "test"); 

     RandomNumberGenerator rng = new SecureRandomNumberGenerator(); 
     SimpleByteSource salt = (SimpleByteSource) rng.nextBytes(); 
     String hashedPasswordBase64 = new Sha256Hash("1234", salt, 1024).toBase64(); 
     User temp = new User(); 

     temp.setName("Myname"); 
     //temp.setPassword("1234"); 
     temp.setPassword(hashedPasswordBase64); 
     temp.setPasswordSalt(salt); 

     ds.save(temp); 

     User user = ds.find(User.class).field("name").equal("Myname").get(); 
     System.out.println(user); 

    } 

我使用Shiro和MOR PHIA,这就是我得到:

Exception in thread "main" java.lang.RuntimeException: org.mongodb.morphia.mapping.MappingException: No usable constructor for org.apache.shiro.util.SimpleByteSource 
    at org.mongodb.morphia.mapping.EmbeddedMapper.fromDBObject(EmbeddedMapper.java:171) 
    at org.mongodb.morphia.mapping.Mapper.readMappedField(Mapper.java:617) 
    at org.mongodb.morphia.mapping.Mapper.fromDb(Mapper.java:592) 
    at org.mongodb.morphia.mapping.Mapper.fromDBObject(Mapper.java:306) 
    at org.mongodb.morphia.query.MorphiaIterator.convertItem(MorphiaIterator.java:79) 
    at org.mongodb.morphia.query.MorphiaIterator.processItem(MorphiaIterator.java:65) 
    at org.mongodb.morphia.query.MorphiaIterator.next(MorphiaIterator.java:60) 
    at org.mongodb.morphia.query.QueryImpl.get(QueryImpl.java:421) 
    at com.roi.shiro.realm.temp.main(temp.java:31) 
Caused by: org.mongodb.morphia.mapping.MappingException: No usable constructor for org.apache.shiro.util.SimpleByteSource 
    at org.mongodb.morphia.mapping.DefaultCreator.getNoArgsConstructor(DefaultCreator.java:140) 
    at org.mongodb.morphia.mapping.DefaultCreator.createInst(DefaultCreator.java:109) 
    at org.mongodb.morphia.mapping.DefaultCreator.createInstance(DefaultCreator.java:27) 
    at org.mongodb.morphia.mapping.DefaultCreator.createInstance(DefaultCreator.java:35) 
    at org.mongodb.morphia.mapping.DefaultCreator.createInstance(DefaultCreator.java:45) 
    at org.mongodb.morphia.mapping.EmbeddedMapper.fromDBObject(EmbeddedMapper.java:161) 
    ... 8 more 
Caused by: java.lang.NoSuchMethodException: org.apache.shiro.util.SimpleByteSource.<init>() 
    at java.lang.Class.getConstructor0(Class.java:3074) 
    at java.lang.Class.getDeclaredConstructor(Class.java:2170) 
    at org.mongodb.morphia.mapping.DefaultCreator.getNoArgsConstructor(DefaultCreator.java:136) 
    ... 13 more 

SimpleByteSource具有下面的构造:

public SimpleByteSource(byte[] bytes) { 
     this.bytes = bytes; 
    } 

什么想法?

回答

5

不能保存与吗啡该对象。 Morphia在填充其字段之前需要一个零参数构造函数来创建类。您需要将该字节[]保存在User类的字段中。

+0

我只是另一个想法。你也许可以写为字段会采取'的byte []',创建'SimpleByteSource',并返回一个转换器。这也会起作用,并会保留你的对象模型。 – evanchooly