2016-04-05 2 views
0

と休止状態で計算されたデータ(passwordHash)を記憶:私は次のコンストラクタを持つオブジェクトを有するスプリング

public User(String name, String email, String password) { 
    this.name = name; 
    this.email = email; 
    this.creationDate = new Date(); 
    this.passwordHash = hashPassword(password, getCreationDate()); 
} 

hashPasswordする塩として、パスワードの文字列とdateを取るpasswordHashを作成する方法です。明らかに、私はそれがハッシュ形式で格納されているだけです。質問は以下のコントローラとのリクエストを考えると、返された値がnullであるということです。

@RequestMapping(method = RequestMethod.POST) @ResponseStatus(HttpStatus.CREATED) public 
@ResponseBody User createUser(@RequestBody User user) { 
    return repository.save(user);} 

JSON:

{ 
"name": "My new user", 
"email": "My email", 
"password": "my password" 
} 

応答:

{ 
"id": 1, 
"name": "My new user", 
"email": "My email", 
"passwordHash": null, 
"creationDate": null 
} 

User.java:

@Entity public class User { 
@Column private Long id; 

@Column(nullable = false) private String name; 

@Column(nullable = false, unique = true) private String email; 

@Column(nullable = false) private String passwordHash; 

@CreationTimestamp private Date creationDate; 

// Constructors 

public User() { 
} 

public User(String name, String email, String password) { 
    this.name = name; 
    this.email = email; 
    this.passwordHash = hashPassword(password, getCreationDate()); 
} 

// Additional methods 

public String hashPassword(String password, Date date) { 
    MessageDigest sha512 = null; 
    try { 
     sha512 = getInstance("SHA-512"); 
    } catch (NoSuchAlgorithmException e) { 
     e.printStackTrace(); 
    } 
    String passwordProposal = password + date 
     .toString(); 
    byte[] passwordDigest = new byte[0]; 
    try { 
     passwordDigest = sha512.digest(passwordProposal.getBytes("UTF-8")); 
    } catch (UnsupportedEncodingException e) { 
     e.printStackTrace(); 
    } 
    return Hex.encodeHexString(passwordDigest); 
} 

public boolean comparePasswords(String password, String passwordHash) { 
    if (hashPassword(password, getCreationDate()).equals(passwordHash)) { 
     return true; 
    } else 
     return false; 
} 

// Getters and setters 

@Id @GeneratedValue(strategy = GenerationType.IDENTITY) public Long getId() { 
    return id; 
} 

public void setId(Long id) { 
    this.id = id; 
} 

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

public String getEmail() { 
    return email; 
} 

public void setEmail(String email) { 
    this.email = email; 
} 

public String getPasswordHash() { 
    return passwordHash; 
} 

public void setPasswordHash(String password) { 
    this.passwordHash = password; 
} 

@Generated(value = GenerationTime.INSERT) public Date getCreationDate() { 
    return creationDate; 
} 

public void setCreationDate(Date creationDate) { 
    this.creationDate = creationDate; 
} 

// toString 

@Override public String toString() { 
    final StringBuilder sb = new StringBuilder("User{"); 
    sb.append("id=").append(id); 
    sb.append(", name='").append(name).append('\''); 
    sb.append(", email='").append(email).append('\''); 
    sb.append(", passwordHash='").append(passwordHash).append('\''); 
    sb.append(", creationDate=").append(creationDate); 
    sb.append('}'); 
    return sb.toString(); 
} 
} 
+1

Userエンティティ全体とそのフィールドのテーブル列定義を投稿してください。 –

答えて

1

問題はdeエンティティコンバーターへのフォルトリクエスト(JSON用にJacksonを使用しているとします)は引数コンストラクターを使用しないため、計算フィールドには値が入りません。

@JsonCreator 
public User(@JsonProperty("name") String name, 
      @JsonProperty("email") String email, 
      @JsonProperty("password") String password) { 
    this.name = name; 
    this.email = email; 
    this.creationDate = new Date(); 
    this.passwordHash = hashPassword(password, getCreationDate()); 
} 

上記のコードはうまくいくはずです。

関連する問題