Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 配置Jackson';通过Grail';s豆DSL_Spring_Grails_Jackson - Fatal编程技术网

Spring 配置Jackson';通过Grail';s豆DSL

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

我需要grails中com.fasterxml.jackson.databind.ObjectMapper的共享实例,因此我认为最标准的方法是通过beans DSL。 我在resources.groovy中尝试了类似的东西(有很多变体,比如使用delegate关键字)

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
  • 写一篇
您可以使用所有SpringIOC容器机制在Grails中进行bean实例化

并不是说我有确切的用例,而是我倾向于创建一个定制的工厂bean,并将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)