Spring 和杰克逊,如何通过@ResponseBody 禁用FAIL_ON_EMPTY_BEANS

Spring and jackson, how to disable FAIL_ON_EMPTY_BEANS through @ResponseBody

spring 中是否有全局配置可以禁用所有使用 @ResponseBody 注释的控制器的 spring FAIL_ON_EMPTY_BEANS?

您可以在配置时配置您的对象映射器configureMessageConverters

@Bean
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
    ObjectMapper mapper = new ObjectMapper();
    mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
    MappingJackson2HttpMessageConverter converter = 
        new MappingJackson2HttpMessageConverter(mapper);
    return converter;
}

如果您想知道如何在您的应用程序中准确执行操作,请使用您的配置文件(xml 或 java 配置)更新您的问题。

这是一个很好的article如何自定义消息转换器。

编辑: 如果您使用 XML 而不是 Java 配置,您可以创建自定义 MyJsonMapper class使用自定义配置扩展 ObjectMapper,然后按如下方式使用它

public class MyJsonMapper extends ObjectMapper {    
        public MyJsonMapper() {
            this.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
        }
}

在你的 XML:

<mvc:annotation-driven>
        <mvc:message-converters>
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                <property name="objectMapper" ref="jacksonObjectMapper" />
            </bean>
        </mvc:message-converters>
</mvc:annotation-driven>


<bean id="jacksonObjectMapper" class="com.mycompany.example.MyJsonMapper" >

如果你使用Spring启动,你可以在application.properties文件中设置如下属性。

spring.jackson.serialization.FAIL_ON_EMPTY_BEANS=false

感谢@DKroot 的宝贵意见。但我相信这对其他人来说应该是它自己的答案。

如果你使用的是Spring Boot/JPA,你还得观察你是否使用的是

getOne(用于 jpa getReference )用于 findOne / enetiyManager.find(Clazz , id)

GetOne 依赖持久性缓存的 ID 引用,旨在检索其中只有 ID 的实体。它的用途主要是为了指示存在引用而无需检索整个实体。

find 方法直接指向持久性管理器以获取持久性实例。

第二个将相应地观察您注释 @JsonIgnore 并给您预期的结果。

 // On entity...
 @JsonIgnore
 @OneToMany(fetch = FetchType.LAZY, mappedBy = "foo")
 private List<Foo> fooCollection;

 // later on persistence impl
 entityManager.find(Caso.class, id);

 // or on serivce 
 casoRepository.findById(id); //...

在 spring boot 2.2.5

中找不到 spring.jackson.serialization.FAIL_ON_EMPTY_BEANS=false

我用这个

@Configuration
public class SerializationConfiguration {
    @Bean
    public ObjectMapper objectMapper() {
        return new ObjectMapper().disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
    }
}

对我来说,问题是从 org.json.JSONObject 对象到 org.json.simple.JSONObject 的类型转换,我解决了它通过解析 org.json.JSONObject 中的值,然后将其转换为用作 org.json.simple.JSONObject

JSONParser parser = new JSONParser();
org.json.simple.JSONObject xmlNodeObj = (org.json.simple.JSONObject) parser.parse(XMLRESPONSE.getJSONObject("xmlNode").toString());