【问题标题】:dependency inject Grails Webflow依赖注入 Grails Webflow
【发布时间】:2011-11-10 12:20:55
【问题描述】:

是否可以将 Spring bean 注入 Grails 网络流?我尝试了以下

class CheckoutController {

    ShoppingService shoppingService

    def checkoutFlow = {
        start {
            action {
                // This attempt to access the service doesn't work
                flow.addresses = shoppingService.getOrder()
            }
        }
    }
}

我可以通过常规控制器操作访问shoppingService,但无法通过网络流操作访问它(见上文)。

【问题讨论】:

  • 您遇到什么错误?我的猜测是,WebFlow 试图将所有访问的域对象存储在流范围内,从而产生一些奇怪的错误。
  • 该服务为空,所以当我尝试访问该服务时,我得到了 NPE。此代码中不涉及域对象

标签: grails groovy spring-webflow


【解决方案1】:

将以下内容添加到您的控制器:

def transient shoppingService 

【讨论】:

    【解决方案2】:

    在包含传统操作和 Web 流的控制器中使用 Web 流进行依赖注入存在问题。如果先执行传统操作,它对我有用。

    见: GRAILS-7095 GRAILS-4141

    Webflows 还打破了混合控制器中 defaultAction 的概念。我发现第一个 webflow 获胜并成为默认操作。

    单独使用 transient 可以防止您的服务在流状态之间被序列化。 (例如,不必实现可序列化)

    【讨论】:

      【解决方案3】:

      起初我以为您列出的内容是伪代码,但我使用您的示例制作了一个示例应用程序并获得了 NPE。我认为问题可能出在您的流程结构上。 action 块应该进入流状态。您的流程定义应类似于:

      class CheckoutController {
        ShoppingService shoppingService
      
        def checkoutFlow = {
      
           start {
             action {
               flow.addresses = shoppingService.getOrder()
               if(flow.addresses) {
                  showForm()
               }
               else {
                  showError()
               }
             }
             on("showForm").to "showForm"
             on("showError").to "showError"
           }
      
           showError {
              ...
           }
           //etc.
        }
      }
      

      您绝对可以在您的网络流中使用注入服务。我猜问题出在你的流程结构上。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-23
        • 2011-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-04
        • 1970-01-01
        相关资源
        最近更新 更多