gpt4 book ai didi

spring - 如何防止hibernate5在jackson序列化json对象时延迟获取?

转载 作者:行者123 更新时间:2023-12-02 08:06:49 25 4
gpt4 key购买 nike

我当前正在运行一个 spring-boot 应用程序,其中端点返回存储在数据库中的特定对象的页面。出于我们的目的,我们将该对象称为“x”。在“x”内有一个设置为延迟获取的对象列表。

@Entity
@DynamicUpdate
class x {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;

@JsonIgnore
@OneToMany(mappedBy = "x", cascade = CascadeType.MERGE, fetch = FetchType.LAZY)
private List<y> lazilyFetchedList;

@Override
public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

@JsonIgnore
public List<y> getLazilyFetchedList() {
return lazilyFetchedList;
}

public void setLazilyFetchedList(List<y> lazilyFetchedList) {
this.lazilyFetchedList = lazilyFetchedList;
}
}

我在上面设置了 @JsonIgnore ,因为我不希望在 GET 调用时将 lazilyFetchedList 发送到客户端。

我的问题是,即使 jackson 作为查看 JSON 响应的客户端成功忽略了该字段。但是,在序列化 Java 对象“x”时,hibernate 仍然会进行额外的查询来获取lazilyFetchedList(即使 jackson 没有使用结果)。

我已经尝试过 Avoid Jackson serialization on non fetched lazy objects 的答案但似乎没有一个答案有效。

这是我的 Controller 的样子:

    @RequestMapping(value = "/{id}/x", method = RequestMethod.GET)
public ApiResponse<?> findX(@PathVariable Integer id, PagingInfo info) {
Page<x> page = repo.findX(id, toPageable(info));
return toResponse(page, FIND_LIST_STATUS);
}

这是我的对象映射器配置:

@Configuration
@EnableWebMvc
public class ApiWebConfig extends WebMvcConfigurerAdapter {

@Bean
public ObjectMapper objectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
configureDefaultObjectMapper(objectMapper);
customizeObjectMapper(objectMapper);
return objectMapper;
}

public static void configureDefaultObjectMapper(ObjectMapper objectMapper) {
objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, true);
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
objectMapper.setSerializationInclusion(JsonInclude.Include.ALWAYS);

objectMapper.registerModule(new Hibernate5Module());

JavaTimeModule javaTimeModule = new JavaTimeModule();
javaTimeModule.addSerializer(ZonedDateTime.class, ZonedDateTimeSerializer.INSTANCE);
javaTimeModule.addSerializer(OffsetDateTime.class, OffsetDateTimeSerializer.INSTANCE);
objectMapper.registerModule(javaTimeModule);
}

/**
* Only register a json message converter
*/
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.clear();

MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
converter.setSupportedMediaTypes(Arrays.asList(MediaType.APPLICATION_JSON, ActuatorMediaTypes.APPLICATION_ACTUATOR_V1_JSON));
converter.setObjectMapper(objectMapper());

converters.add(converter);
}
}

版本:

  • Spring-Boot 1.5.3
  • jackson 2.8.6
  • Hibernate 5.0.11.Final
  • jackson 数据类型-hibernate5 2.9.0

最佳答案

将以下依赖项添加到您的 pom.xml 中:

<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-hibernate5</artifactId>
</dependency>

(如果不是由 spring-boot-dependency 或 spring-boot-starter-parent 管理,请添加版本)将以下代码添加到您的 spring 配置类中:

@Bean
protected Module module() {
return new Hibernate5Module();
}

具有以下导入:

import com.fasterxml.jackson.databind.Module;
import com.fasterxml.jackson.datatype.hibernate5.Hibernate5Module;

关于spring - 如何防止hibernate5在jackson序列化json对象时延迟获取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45744181/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com