Json 获取相关实体作为基类型
我目前正在尝试设置一个数据库-仅使用Java。考虑到这个可能出现在普通社交网络应用程序中的简单类:Json 获取相关实体作为基类型,json,jpa,Json,Jpa,我目前正在尝试设置一个数据库-仅使用Java。考虑到这个可能出现在普通社交网络应用程序中的简单类: @Entity class User { @Id private String email; private String name; private String otherInfo; @ManyToMany private List<User> contacts; } @实体 类用户{ @身份证 私人字符串电子邮件; 私有字符串名
@Entity
class User {
@Id
private String email;
private String name;
private String otherInfo;
@ManyToMany
private List<User> contacts;
}
@实体
类用户{
@身份证
私人字符串电子邮件;
私有字符串名称;
私有字符串otherInfo;
@许多
私人名单联系人;
}
当用户登录时,他应该会收到基本信息和联系人列表以及他们的基本信息,而不是他们的联系人。为了减少锅炉板代码的数量,我想使用像Gson这样的标准解决方案。但是,即使使用延迟获取,整个用户也会加载到gson.toJson(user)
因此,我考虑将基本信息提取到一个基类
BasicUser
,并将contacts
更改为List
。现在,当我获取联系人时,我只需要绕过鉴别器列——当然,他们都保存为服务器上的完整用户。不幸的是,我不知道该怎么做。有什么想法吗?如果您只需要获取实体的一部分就可以使用。例如,在您的情况下,它可以是这样的:
public interface BaseUser {
String getEmail();
String getName();
String getOtherInfo();
}
public interface UserRepo extends JpaRepository <User, String> {
List<BaseUser> findAllBy();
}
公共接口BaseUser{
字符串getEmail();
字符串getName();
字符串getOtherInfo();
}
公共接口UserRepo扩展了JpaRepository{
列出findAllBy();
}
您不应该为了容纳序列化库而修改域模型
如果您只希望集合的某些字段向JSON公开,那么可以将Jackson与
@JsonView
(参见此处:)一起使用,但不确定Gson是否提供了类似的功能,因为我从未广泛使用过它 使用Jackson进行序列化,无需编写自定义序列化代码即可解决此问题BasicUser
包含属性的getter,我想序列化:
public interface BasicUser {
String getEmail();
String getFirstName();
String getLastName();
}
通过单个注释,contacts
属性被解释为BasicUser
s的列表:
@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
}
@实体
公共类用户实现BasicUser{
@身份证
私人字符串电子邮件;
私有字符串名;
私有字符串lastName;
@许多
@JsonSerialize(contentAs=BasicUser.class)
private List contacts=new ArrayList();
//…实现的getter
}
我同意最好将网络com的持久性和序列化分离。有了你对杰克逊的支持,我设法解决了我的问题,尽管JsonView
?因为我无法根据实体图的深度切换视图,所以无法执行此操作。在第一层(登录用户),我想序列化联系人
属性,但在第二层(用户的联系人)上,应该是ommitted。对不起,我刚刚意识到我链接到了错误的问题。我特别是指这种方法:。您只需跳过JsonView
中的User.contacts
,该联系人将被传递到JsonSerializer
(您的问题与我链接的问题完全相同,只是A
和B
是相同的)