请求正文中的嵌套实体将被忽略

时间:2016-12-05 03:22:59

标签: spring-mvc

域模型是

  • 一个行业有很多公司
  • 公司属于某个行业

所以我有我的实体类:

@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。如何让控制器接受嵌套实体?

2 个答案:

答案 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>