我目前正在尝试设置数据库 - 仅使用Java。鉴于这个简单的类可能出现在普通的社交网络应用程序中:
@Entity
class User {
@Id
private String email;
private String name;
private String otherInfo;
@ManyToMany
private List<User> contacts;
}
当用户登录时,他应该收到基本信息和联系人列表及其基本信息,但不是他们的联系人。为了减少锅炉板代码的数量,我想使用像Gson这样的标准解决方案。但是,即使使用延迟提取,整个用户也会加载到gson.toJson(user)
。
因此,我考虑将基本信息提取到基类BasicUser
并将contacts
更改为List<BasicUser>
。现在,我只需要在获取联系人时以某种方式绕过鉴别器列 - 当然它们都被保存为服务器上的完整用户。不幸的是,我不知道如何实现这一目标。有什么想法吗?
答案 0 :(得分:1)
如果您只需要获得实体的一部分,则可以使用projections。在你的情况下,它可以是,例如,像这样:
public interface BaseUser {
String getEmail();
String getName();
String getOtherInfo();
}
public interface UserRepo extends JpaRepository <User, String> {
List<BaseUser> findAllBy();
}
答案 1 :(得分:1)
您不必修改域模型只是为了容纳序列化库。
如果您只希望将某个集合的某些字段暴露给JSON,那么您可以将杰克逊与@JsonView
一起使用(请参阅此处:How to serialize using @Jsonview with nested objects),不确定Gson是否提供了与我从未有过的类似功能广泛使用它。
答案 2 :(得分:1)
使用Jackson进行序列化,无需编写自定义序列化代码即可解决问题。 BasicUser
包含属性的getter,我想序列化:
public interface BasicUser {
String getEmail();
String getFirstName();
String getLastName();
}
使用单个注释,contacts
属性被解释为BasicUser
的列表:
@Entity
public class User implements BasicUser {
@Id
private String email;
private String firstName;
private String lastName;
@ManyToMany
@JsonSerialize(contentAs = BasicUser.class)
private List<User> contacts = new ArrayList<>();
// ... implemented getters
}