【问题标题】:Grails Spring DSL Not Setting String PropertiesGrails Spring DSL未设置字符串属性
【发布时间】:2011-12-17 21:47:27
【问题描述】:

我的服务上的 2 个简单字符串属性:

class MyService {

    static transactional = false

    def uri1
    def uri2
}

resources.groovy:

beans = {
    myService(com.myapp.MyService) {
        uri1 = 'http://my.endpoint1.com'
        uri2 = 'http://my.endpoint2.com'
    }
}

而且.. 两个属性都保持为空。似乎足够简单和明显,但几乎没有继续下去,我似乎明确地遵循文档和我发现的一些帖子..有什么想法吗?谢谢。

我尝试将属性键入为 String、def、static String.. 没有任何帮助。 我试过在属性闭包和 bean.str1 等中使用 bean -> ......没有任何帮助。

更新: 目标只是通过 Spring 在 Service 类上设置这些字符串属性。是的,使用 Config.groovy 是一个选项,但这需要一个额外的步骤来访问配置。在这种情况下,我发现这是一个不必要的跳跃。毕竟是在使用 Spring,所以为什么不使用它。在我的情况下,它们恰好是 URI(更新的示例代码)。

请参阅:http://grails.org/doc/1.0.x/guide/14.%20Grails%20and%20Spring.html 14.3,例如。 其中driverClassName = "org.hsqldb.jdbcDriver" 在数据源注册上设置。我尝试将 java 样式的 setter 和 getter 添加到 Service 类,仍然为空

【问题讨论】:

标签: spring grails


【解决方案1】:

你不会发疯的,这应该完全按照你的想法工作。

我已经准备了一个示例项目以在github 上确认这一点:

https://github.com/gid79/so-q8548146-spring-dsl

我用grails 1.3.4准备的例子,刚好是我本地安装的版本,用了一段时间了。

您可能在使用的版本中偶然发现了一个错误,您的参考是 1.0.x 文档,您使用的是哪个版本?

【讨论】:

  • 啊,感谢您的澄清(我确实开始质疑我的理智;)我使用的是 1.4.0.M1,应该提到这一点。还有……哦!好的,您的测试代码完全按照我的预期工作......所以我重新审视了我的代码,一切都是一样的......除了我在这里运行单元测试......并且在我的单元案例中......我是新的 -手动设置服务测试目标。是的,我意识到这意味着没有 DI,所以没有 Spring 设置属性。重构让服务成为测试类的成员,生活美好!感谢您的帮助,新的视角最终让我到达了那里:)
【解决方案2】:

我不明白总体目标。

resources.groovy 可用于定义 bean。 MyService 因为会被 grails 自动“注入”到各处,所以你可以通过以下方式访问它:

def myService

然后您可以调用 myService 上的方法,通常是在您的控制器中。

如果您尝试定义“应用程序设置”,那么 Config.groovy 就是我认为应该去的地方:

icooeee {
  defaultCategory = "lifestyle"
}

并在 grails 控制器、服务等中阅读此内容:

ConfigurationHolder.config.icooeee.defaultCategory

如果您想在插件或库中初始化 src/java 中定义的 bean - java 对象。然后构造函数参数是有意义的,根据您正在谈论的 grails 文档:http://grails.org/doc/1.0.x/guide/14.%20Grails%20and%20Spring.html

MVC/域驱动设计确实表明 grails 域对象应该维护数据和与数据相关的逻辑。因此,在维护与服务相关的状态时要考虑这一点。

我已经成功地在 resources.groovy 中为 apache-camel 配置了 bean。请注意,这些正在初始化底层的 apache camel 对象,而不是通常“免费”提供的 grails 对象:

case "development":
  jmsConnectionFactoryLocal(org.apache.activemq.ActiveMQConnectionFactory) {
    brokerURL = 'vm://localhost'
  }

  _jmsConnectionFactory(ActiveMQConnectionFactory) {
    brokerURL = ConfigurationHolder.config.caller.activemqServer
  }

  jmsConnectionFactory(org.apache.activemq.pool.PooledConnectionFactory) {
    connectionFactory = ref('_jmsConnectionFactory')
  }

  jmsConfig(org.apache.camel.component.jms.JmsConfiguration) {
    connectionFactory = ref('_jmsConnectionFactory')
    transacted = true
    concurrentConsumers = 10
  }

  activemqServer(org.apache.activemq.camel.component.ActiveMQComponent) {
    configuration = ref('jmsConfig')
  }
  break

【讨论】:

  • 感谢您的尝试,虽然目标应该很明显,在上面添加更多细节-
  • 此外,在域对象中维护什么状态,或者服务将如何注入,例如,控制器,在这里几乎无关紧要 - 我们只是在谈论 DSL 如何配置 Spring按照配置实例化 bean。告诉 Spring 简单地将这些字符串值分配给所述属性是非常标准的东西。
  • 鲍比——可能就是这个。如果您在 resources.groovy grails.1312388.n4.nabble.com/… 中定义对象,则不会自动装配。因此,bean.autowire = 'byName'
  • 感谢您的尝试,但这只是当您在资源中定义一个bean(直接使用Spring)并希望将另一个服务自动注入其中时..您需要在那里与Spring更加亲密,而不是我的情况。原来这是我的服务类在测试类中的构造方式。它本身需要由 DI 实例化,以便注入其依赖项。因为我自己在测试方法中“更新”它,所以 Spring/grails 没有机会对其执行注入。无论如何谢谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-20
  • 2020-11-03
  • 2012-03-21
  • 2020-10-28
相关资源
最近更新 更多