我有一个用户实体:
films
及其存储库:
public class SpringUsers implements Serializable {
private String password;
// other fields omitted
@Basic
@Column(name = "password")
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
我有一个控制器方法,应该获得具有相同userId(内部使用)的所有注册用户的列表作为当前经过身份验证的用户:
public interface SpringUsersRepository extends CrudRepository<SpringUsers, Integer> {
SpringUsers findByUsername(String username);
List<SpringUsers> findByUserId(Integer userId);
}
我不想将密码(即使它已加密)传递给前端 - 所以我通过用户流式传输并将密码设置为null,如上所示。
但是,我想知道是否有可能不包括用户&#39;查询结果中的密码首先出现在哪里?
版本信息:
Spring boot 1.4.0&amp; Hibernate 5.0.9.Final
答案 0 :(得分:7)
您可以使用@Query
有选择地包含一些字段:
// Include all fields you wanna query for using u.x syntax
// AFAIK there is no exclusion syntatic sugar
@Query("select u.id, u.username from SpringUsers u where u.id = ?1")
List<SpringUsers> findByUserId(Integer userId);
您也可以使用Projections。首先通过引入投影界面来定义投影:
interface NoPasswordUser {
Long getId();
String getUsername();
// Do not include getPassword();
}
然后在您的存储库中使用它:
public interface SpringUsersRepository extends CrudRepository<SpringUsers, Integer> {
NoPasswordUser findByUsername(String username);
List<NoPasswordUser> findByUserId(Integer userId);
}
无论如何,最好不要通过REST或任何远程接口公开您的实体。你可以使用DTO,这个post可能在这方面很有用。
答案 1 :(得分:2)
我不认为有一种方法可以在从db获取实体时忽略某些字段,因为这些实体不会处于一致状态 - 它们的数据与数据库中的数据不同。但是存在其他选项(自定义查询,投影)。
一种选择是使用constructor expressions并在查询中直接填充一些POJO
select new my.company.SafeUser(u.username, u.email) from User u
无论如何,我认为您应该将DTO发送到前端,并在其中公开您在前端需要的属性。这种方法有很多优点,如上例所示,或者在结果循环中初始化它们的天气。
答案 2 :(得分:2)
使用@JsonIgnore,这将使其在后面可用,但在转换为json时不会返回
@Size(min = 8)
@JsonIgnore
private String password;
答案 3 :(得分:0)
排除密码写入json并保持读取的最佳方法是Jackson注解:
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private String password;
类似,注册日期:
@JsonProperty(access = JsonProperty.Access.READ_ONLY)
private Date registered = new Date();