Существует ли глобальная конфигурация в spring, которая может отключить spring FAIL_ON_EMPTY_BEANS для всего контроллера, аннотированного с помощью @ResponseBody?
Spring и jackson, как отключить 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); //...