我有一个带有 JPA 的 Spring Boot API。在这个项目中,我有一个名为 CommunityProfile 的类,其中包含几个延迟加载的字段。
我需要通过 webhook 发送此数据,并且发送数据的方法应该能够处理任何数据。当尝试序列化对象时,我收到错误:
Exception: failed to lazily initialize a collection of role: my.package.CommunityProfile.awards: could not initialize proxy - no Session
我的 ObjectMapper 类设置如下:
@Bean
@Primary
public ObjectMapper objectMapper() {
return new ObjectMapper()
.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false)
.configure(SerializationFeature.)
.registerModule(new Hibernate5Module())
.registerModule(new JavaTimeModule())
.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
}
我序列化对象的代码是:
String json = objectMapper.writeValueAsString(data);
其中
data
是 Object
类型(可以是任何类型)。
JsonViews 和 JsonIgnore 不符合我的需求,因为它们已经用于其他元素。意见赞赏。
解决方法如下
要使用Jackson ObjectMapper序列化对象时处理延迟加载字段的问题,可以使用以下方法:
1) 有选择地在延迟加载字段上使用 @
JsonIgnore
注解,以在未加载时将其排除在序列化之外。
2) 当您需要通过 webhook 发送数据时,请确保在序列化之前初始化(热切加载)延迟加载的字段,以避免出现“无法初始化代理”异常。这可以通过显式加载所需的数据来完成。
以下是实现此方法的方法:
1) 在
CommunityProfile类中的延迟加载字段上使用
@JsonIgnore
:
@Entity
public class CommunityProfile {
// Other fields and annotations
@JsonIgnore
@OneToMany(mappedBy = "communityProfile", fetch = FetchType.LAZY)
private List<Award> awards;
// Getters and setters
}
2) 在为您的 Webhook 序列化 CommunityProfile 之前,请确保根据需要初始化延迟加载字段。您可以通过修改代码以显式加载所需的数据来实现此目的。例如:
@Service
public class CommunityProfileService {
// Autowire your repository or service
public CommunityProfile loadCommunityProfileWithAwards(Long id) {
// Load the CommunityProfile with awards eagerly
CommunityProfile communityProfile = communityProfileRepository.findById(id).orElse(null);
// Initialize the awards collection
if (communityProfile != null) {
communityProfile.getAwards().size();
}
return communityProfile;
}
}
3) 然后,像之前一样序列化 CommunityProfile 对象:
String json = objectMapper.writeValueAsString(data);
这样,您可以确保延迟加载的字段在序列化之前初始化,避免出现“无法初始化代理”异常。它还允许您根据请求使用任何数据类型,并且您可以根据需要将此方法应用于具有延迟加载字段的其他实体。