从服务在ApplicationTagLib中创建Link

问题描述 投票:0回答:3

我正在尝试了解如何使用从服务调用的 ApplicationTagLib 中的 createLink 创建链接。

Grails: 3.2.8

代码:

def applicationTag = new ApplicationTagLib()

def abc = application.Tag.createLink(controller:"accomodate", action:"menu", id:4)

错误:

org.grails.taglib.GrailsTagException:标签 [createLink] 不存在。 没有找到对应的标签库。

我对这个版本很陌生。如果您帮助我找出我的代码存在什么样的错误,我将非常感激。

grails
3个回答
5
投票

试试这个:

import grails.core.support.GrailsApplicationAware
import grails.core.GrailsApplication
import grails.web.mapping.LinkGenerator
   class MyService implements GrailsApplicationAware{
      GrailsApplication grailsApplication
      def config
      LinkGenerator grailsLinkGenerator

      def myMethod() {

          def url = hostname+grailsLinkGenerator.link(controller: 'someController', action: 'something', params:[token:something], absolute: 'false')
    }
     void setGrailsApplication(GrailsApplication ga) {
        config = ga.config
    }
}

...

String hostname=grailsApplication.config.myApp?.hostName
        def url=hostname+grailsLinkGenerator.link(controller: 'someController', action: 'something', params:[token:something], absolute: 'false')

def url=grailsLinkGenerator.link(controller: 'someController', action: 'something', params:[token:something], absolute: true)

ED2A 如果你一定要

我有 applicationTag lib 以这种方式工作:

import grails.util.Holders
import org.grails.plugins.web.taglib.ApplicationTagLib

 class SomeService { 

 def g = Holders.grailsApplication.mainContext.getBean(ApplicationTagLib)


   def someMethod() {
       def aa = g.createLink('something')
   }
  }

以这种方式做事的问题是,如果你开始点击表示层引用,那么你可能会得到

No thread-bound request found
。特别是来自石英作业和真实用户范围之外的任何调用。您可以使用这个示例来解决所有这些问题。但是,当上面的 grailsLinkGenerator 示例不会解决任何可能出现的问题时,为什么还要经历这一切


0
投票

我来到这里是因为我只是想在常规 service 类中创建一个链接,V H 的回答^ 帮助了我; 谢谢你! :D

但是对于那些和我有同样需求的人来说,这足以让我们工作(Grails 版本 4.0.4):

import grails.web.mapping.LinkGenerator

并在服务方法中:

def link = grailsLinkGenerator.link(
  controller: 'controlerName',
  action: 'actionName',
  params: [uuid: "uuidExample"]
)

再次感谢您,V H! :)


0
投票

或者,您可以使用

ResponseRedirector
特征来扩展您的控制器(无论如何它都会显式地扩展您的控制器)。它将有
getGrailsLinkGenerator
方法。并且
LinkGenerator
会有
link
方法

© www.soinside.com 2019 - 2024. All rights reserved.