Jackson ObjectMapper 忽略惰性字段

问题描述 投票:0回答:1

我有一个带有 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 不符合我的需求,因为它们已经用于其他元素。意见赞赏。

java spring-boot objectmapper
1个回答
0
投票

解决方法如下

要使用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);

这样,您可以确保延迟加载的字段在序列化之前初始化,避免出现“无法初始化代理”异常。它还允许您根据请求使用任何数据类型,并且您可以根据需要将此方法应用于具有延迟加载字段的其他实体。

© www.soinside.com 2019 - 2024. All rights reserved.