ObjectMapper.writeValueAsString JsonMappingException:未能延迟初始化

ObjectMapper.writeValueAsString JsonMappingException:未能延迟初始化,json,spring-boot,jpa,spring-test,objectmapper,Json,Spring Boot,Jpa,Spring Test,Objectmapper,有两个问题我不明白。 首先,控制台上的错误消息。它没有给我完整的错误信息。因此,我根本不理解这个问题:IDE是STS 第二,为什么我会得到这个错误,JsonMapping未能延迟初始化一个 @Test public void testUpdateCar() throws Exception { Car car = carRepository.findById(new Long(1)).get(); car.setBrand("Mazda"); car.setModel("

有两个问题我不明白。 首先,控制台上的错误消息。它没有给我完整的错误信息。因此,我根本不理解这个问题:IDE是STS

第二,为什么我会得到这个错误,JsonMapping未能延迟初始化一个

@Test
public void testUpdateCar() throws Exception {
    Car car = carRepository.findById(new Long(1)).get();
    car.setBrand("Mazda");
    car.setModel("326");

    String putJSON = objectMapper.writeValueAsString(car);
    mockMVC.perform(MockMvcRequestBuilders.put(String.format("/api/cars/%d", car.getId())).contentType(MediaType.APPLICATION_JSON_UTF8).content(putJSON))
    .andDo(MockMvcResultHandlers.print())
    .andExpect(MockMvcResultMatchers.status().isCreated())
    .andExpect(MockMvcResultMatchers.content().contentType("application/hal+json;charset=UTF-8"));
}
汽车:

更新1: 错误本身:

com.fasterxml.jackson.databind.JsonMappingException:未能延迟 初始化角色的集合: me.eraytuncer.carpool.entity.User.carList,无法初始化代理 -通过引用链没有会话:me.eraytuncer.carpool.entity.Car[owner]->me.eraytuncer.carpool.entity.User[carList]

更新2:

更新3:

更新4:

添加@JsonIgnore以某种方式解决了这个问题。也许这是一个由无限递归引起的误导性问题?

您已将@OneToOne映射到@OneToMany。它应该是拥有方的@ManyToOne:

    @ManyToOne
    @JoinColumn(name = "user_id") // if needed
    private User owner;

我遇到了同样的问题,通过在方法上使用@Transactional解决了这个问题@事务性帮助保持会话打开,以便可以提取惰性集合。

类似于字段

private List<Car> carList;
在@OneToMany中延迟解析为默认的获取类型,这意味着只有在调用此字段的getter时才从DB填充它。在您的情况下,它由Hibernate会话范围之外的Jackson序列化程序调用,并且无法填充属性。在carList属性的@OneToMany中将fetch类型更改为EAGER应该会有所帮助


也考虑使用DTO模式,因为从API返回实体被认为是不好的实践。

显示用户实体,以及您的控制器方法。错误行是在字符串PtjsOnObjtMaPr.WrordEngestAsString Car;可能重复将@JsonIgnore添加到私有列表carList中;解决了我的问题。可能是嵌套json数据导致的误导问题?上传控制器逻辑没有帮助。您能检查一下我的更新4吗?更新4似乎证实了我的解释:@JsonIgnore使Jackson忽略此字段,因此不会调用getter,也不会从DB中获取汽车列表。取决于所需内容-是否希望此字段从API返回?另外@Maciej Kowalski的答案是有效的-您应该使用@manytone-in-Car-entity,但这不是问题的根源。如果我已经使用了DTO模式,我就不需要@JsonIgnore了。我现在明白了;
@PutMapping("/cars/{id}")
ResponseEntity<?> replaceCar(@RequestBody Car newCar, @PathVariable Long id) {
    if (repository.existsById(id)) {
        newCar.setId(id);
        Resource<Car> carResource = assembler.toResource(repository.save(newCar));
        try {
            return ResponseEntity
                    .created(new URI(carResource.getId().expand().getHref()))
                    .body(carResource);
        } catch (URISyntaxException e) {
            e.printStackTrace();
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
        }                   
    } else {
        throw new CarNotFoundException(id);
    }
}
    @ManyToOne
    @JoinColumn(name = "user_id") // if needed
    private User owner;
private List<Car> carList;