Spring 配置Jackson';通过Grail';s豆DSL
我需要grails中com.fasterxml.jackson.databind.ObjectMapper的共享实例,因此我认为最标准的方法是通过beans DSL。 我在resources.groovy中尝试了类似的东西(有很多变体,比如使用delegate关键字)Spring 配置Jackson';通过Grail';s豆DSL,spring,grails,jackson,Spring,Grails,Jackson,我需要grails中com.fasterxml.jackson.databind.ObjectMapper的共享实例,因此我认为最标准的方法是通过beans DSL。 我在resources.groovy中尝试了类似的东西(有很多变体,比如使用delegate关键字) objectMapper(ObjectMapper) { bean -> bean.setVisibility(PropertyAccessor.ALL, Visibility.ANY) bean.confi
objectMapper(ObjectMapper) { bean ->
bean.setVisibility(PropertyAccessor.ALL, Visibility.ANY)
bean.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
}
但是它不起作用,ObjectMapper是以默认方式配置的,这在grails中不起作用。
我使用了一种解决方法,可以满足我的需要(在BootStrap.groovy中):
有谁能告诉我如何在beans DSL中实现它,它所属的位置(IMHO)?bean闭包参数的类型是的某个子类型,它不引用实际的对象实例本身
有多种方法可以设置可见性和配置ObjectMapper实例:
- 创建一个子类并在构造函数中完成工作
- 在中实例化ObjectMapper
- 写一篇
//resources.groovy
beans = {
jf(com.fasterxml.jackson.core.JsonFactory)
objectMapper(ObjectMapper, jf){
visibility(PropertyAccessor.ALL, Visibility.ANY)
configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
}
}
这可以在控制台中通过以下方式进行验证:
assert grailsApplication.mainContext.objectMapper instanceof com.fasterxml.jackson.databind.ObjectMapper
对于可见性位,您可以设置一个
VisibilityChecker
,而不是使用便利的setVisibility
方法
vc(VisibilityChecker.Std, Visibility.ANY)
objectMapper(ObjectMapper) {
visibilityChecker = ref('vc')
}
但是configure
调用更加困难,您必须使用工厂bean方法来调用该方法,定义一个单独的bean。关键是,您不想自己调用这些方法,而是试图告诉Spring在创建bean时需要调用什么:
objectMapperConfig(objectMapper:'configure',
DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
由于configure返回对映射器本身的引用,因此确保以正确顺序解析依赖关系的更好方法可能是
vc(VisibilityChecker.Std, Visibility.ANY)
objectMapperUnconfigured(ObjectMapper) {
visibilityChecker = ref('vc')
}
objectMapper(objectMapperUnconfigured:'configure',
DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
然后使用
objectMapper
作为注入到其他地方的bean。谢谢,子类化对我来说很好,也很简单(而且很有效)。如果没有人提供纯DSL解决方案,我会接受这一点,谢谢,但它似乎不适用于Grails2.3(没有尝试早期版本)。它抱怨没有找到“bean”属性;删除它将导致默认设置ObjectMappper@RiccardoCossu您能告诉我您指的是哪个ObjectMapper
?ObjectMapper
的完整包名?刚刚编辑了问题,我的错:它是com.fasterxml.jackson.databind。ObjectMapper@RiccardoCossu在这里根据您的信息更新了我的答案。@Riccardocassu我认为Ian的方法更好、更合适,除非您想明确设置可见性,您必须使用他对configure
所做的相同方法,因为setVisibility
再次返回ObjectMapper
。感谢和+1的回复,但我认为子类化是最简单、最干净的approach@RiccardoCossu是的,我认为子类化和添加@PostConstruct public void init()
将是最干净的方法。同意,但就我的使用而言,在构造函数中编写它就足够了:-)
vc(VisibilityChecker.Std, Visibility.ANY)
objectMapperUnconfigured(ObjectMapper) {
visibilityChecker = ref('vc')
}
objectMapper(objectMapperUnconfigured:'configure',
DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)