Spring и jackson, как отключить FAIL_ON_EMPTY_BEANS через @ResponseBody

Существует ли глобальная конфигурация в spring, которая может отключить spring FAIL_ON_EMPTY_BEANS для всего контроллера, аннотированного с помощью @ResponseBody?

Ответ 1

Вы можете настроить свой сопоставитель объектов при настройке 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 configs).

Вот хороший article способ настройки конвертеров сообщений.

Изменить:. Если вы используете XML вместо конфигураций Java, вы можете создать собственный MyJsonMapper класс, расширяющий 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" >

Ответ 2

Если вы используете Spring Boot, вы можете установить следующее свойство в файле application.properties.

spring.jackson.serialization.FAIL_ON_EMPTY_BEANS=false

Благодаря @DKroot за его ценный комментарий. Но я считаю, что это должен быть собственный ответ для других.

Ответ 3

Если вы используете Spring Boot/JPA, вы также должны наблюдать, используете ли вы

getOne (используется для jpa getReference) для findOne/enetiyManager.find(Clazz, id)

GetOne Опирается на сохраненную в кэше ссылку по идентификатору, которая предназначена для извлечения сущности только с идентификатором. Его использование было главным образом для указания, что ссылка существует без необходимости извлечения целого объекта.

Метод 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); //...