域模型是
所以我有我的实体类:
@Entity
public class Industry {
@Id @GeneratedValue
private Long id;
private String name;
@OneToMany(targetEntity = Company.class, fetch = FetchType.LAZY, mappedBy = "industry")
private Collection<Company> companies = new ArrayList<>(0);
// Getters and setters
}
和
@Entity
public class Company {
@Id @GeneratedValue
private Long id;
private String name;
@ManyToOne(cascade = CascadeType.DETACH, fetch = FetchType.EAGER, optional = false)
private Industry industry;
// Getters and setters
}
我的控制器:
@RestController
@RequestMapping("/companies")
public class CompaniesController extends ControllerBase {
@RequestMapping(method = RequestMethod.POST)
public Company create(@RequestBody Company company) {
company.getIndustry(); // returns null
// ...
}
}
当我向请求正文
发送请求POST /companies
时
{
"name": "Walmart",
"industry": {
"id": 1
}
}
我发现company.getIndustry()
始终返回null
。如何让控制器接受嵌套实体?
答案 0 :(得分:0)
实体是基于会话的。它们通常基于Lazy加载工作。只加载第一级并在需求时加载其他属性。您无法将其从一个图层传递到另一个图层。 (服务于控制器)
正确的方法。在控制器中有一个Value对象(一个简单的类)。在前端和后端之间使用它。将相同的值对象发送到服务。并且仅在Service和DAo层之间使用实体
公共类CompanyVO {
private Long id;
private String name;
private IndustryVO industryVO; // create similar class
// Getters and setters
}
@RestController @RequestMapping( “/公司”) 公共类CompaniesController扩展ControllerBase {
@RequestMapping(method = RequestMethod.POST)
public Company create(@RequestBody CompanyVO companyVO) {
companyVO.getIndustry(); // returns null
// ...
}
}
答案 1 :(得分:0)
这可能是因为您需要另一个Spring消息转换器而不是默认消息转换器。只需将 jackson 添加到pom.xml
,Spring就会使用MappingJackson2HttpMessageConverter
。
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.5</version>
</dependency>