我想知道@Autowire
究竟如何运作的问题。我目前的问题是数据模型中基于对象的关系:
假设存在多对一关系,在模型中定义了两种方式:
@Entity
@Table(name = "Company")
public class Company {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "Id", nullable = false)
private Integer id;
@Column(name = "Code", nullable = false)
private String code;
@Column(name = "Name", nullable = false)
private String name;
...
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "CountryCodeA3")
private Country country;
...
@Entity
@Table(name = "Country")
public class Country {
@Column(name = "CodeA2", nullable = false)
private String codeA2;
@Id
@Column(name = "CodeA3", nullable = false)
private String codeA3;
@Column(name = "CodeNum", nullable = false)
private String codeNum;
@Column(name = "Name", nullable = false)
private String name;
@OneToMany(fetch = FetchType.EAGER, mappedBy = "country")
private Set<Company> companies;
...
然后我声明一些标准的DAO来访问这两个对象,最后是控制器(这里只是相关的函数):
@ApiOperation(value = "List of all companies", notes = "List of all companies for our system.", response = Company[].class)
@ApiResponses(value = { @ApiResponse(code = HttpServletResponse.SC_OK, message = "OK") })
@RequestMapping(value = obj_names_api, method = RequestMethod.GET)
public ResponseEntity<SmartHttpResult> companyGetAll() {
final List<Company> list = dao.findAll();
return Response.getHttpResult(list, list.size() > 0, "/", "COMPANY_NOT_FOUND");
}
这会很好地序列化我的Country
和Company
对象,将结构良好的JSON对象返回给客户端。它会遍历所有关系并获取适当的对象。
示例返回对象:
{
"id": 0,
"code": "string",
"name": "string",
"country": {
"codeA2": "string",
"codeA3": "string",
"name": "string"
}
}
这也不是我想要的。
我想要的是使用Java中的对象并仅为Company.countryCodeA3
序列化FK字段值之类的简单事物。我也不需要整个反向关系数组来到客户端,除非我明确告诉它去那里(通过一个单独的函数)。我不知道如何创建公司并指定该公司所在的国家/地区(未实际将整个国家/地区对象添加到POSTed公司)。
我知道如何编写函数来实际检索关系。我不知道(这就是问题)是如何告诉他们在序列化一个特定对象时不要深入。我只想发送国家ID来告诉该公司所属的国家/地区 - 如果是多对多关系,请列出ID。
那么,我可以告诉Spring + Hibernate仅序列化简单对象并仅通过单独的函数提供对象关系吗?
答案 0 :(得分:0)
存在很多方法,其中一种方法是使用@JSON
注释。使用此注释,您可以控制应序列化/反序列化的字段。
JSON注释可用于将对象中的字段标记为默认包含。注释可以放在方法或字段上。一个很好的例子可能是包含对Zipcode对象的引用的Address对象。由于Zipcode是每个地址(在美国)中不可或缺的一部分,因此我们可能更有意义地使用注释来默认它。所以在我们的Address对象中,我们可以执行以下操作:
public class Address {
private String name;
private String street;
private String city;
private String state;
private Zipcode zipcode;
@JSON
public Zipcode getZipcode() { }
}
注释可以提高您的安全性,以便不应该通过线路发送的字段可以固定在一个地方。这样,您可以使代码更加DRY,从而防止意外的安全漏洞。考虑我们是否在我们的User对象中存储密码的哈希版本。
public class User {
private String login;
private String hashedPassword;
private Date lastLogin;
@JSON(include=false)
public String getHashedPassword() { }
}