Spring-MVC控制器上的Groovy mixin

时间:2013-06-13 06:40:05

标签: spring-mvc groovy mixins

我正在尝试在spring-mvc控制器类上使用Groovy mixin转换,但是Spring没有从类中的混合中获取请求映射。

class Reporter {
    @RequestMapping("report")
    public String doReport() {
        "report"
    }
}

@Mixin(Reporter)
@Controller
@RequestMapping("/a")
class AController {
    @RequestMapping("b")
    public String doB() {
        "b"
    }
}

运行此代码时.../a/b url已映射并正常工作,但.../a/report未映射并返回HTTP 404.在调试模式下,我可以访问doReport上的AController方法通过鸭子打字。

当使用extends时,这种类型的请求映射继承实际上适用于Java类;为什么它不适用于Groovy的mixin?我猜测要么mixin转换不会在方法上传输注释,要么Spring的组件扫描器在处理mixin之前工作。无论哪种方式,是否有更实用的方法来实现此功能(我不希望AController因其他原因扩展Reporter,所以这不是一个选项)?

2 个答案:

答案 0 :(得分:3)

您可以在下面找到我在Groovy用户邮件列表中从 Guillaume Laforge (Groovy项目经理)获得的回复。

  

您好,

     

我没有看过Spring MVC的实现,但我怀疑   它使用反射来查找可用的方法。和“mixin”   动态添加方法,它不是可见的东西   反射。

     

多年来我们在@Mixin遇到了问题,并且正在实施   尽管我们努力修复它,但远非理想和错误。它的   可能我们很快就会弃用它,并引入类似的东西   静态mixins或traits,然后将添加“for real”方法   这个类,这意味着像doReport()这样的方法会被a看到   像Spring MVC这样的框架。

     

该领域已有一些举措,如原型   来自Cédric的分支以及Grails的基本功能   那(即通过AST转换添加“真实”方法)。   虽然没有做出明确的决定,但这是我们的事情   喜欢调查并尽快提供。

     

现在回到你的问题,也许你可以调查使用   @代表?您将在您的帐户中添加@Delegate Reporter记者属性   控制器类。我不记得@Delegate是否携带了   注释,我没有仔细检查,但如果确实如此,那可能是一个   在短期内为您提供良好的解决方案。

     

纪尧姆

使用@Delegate转换本身并不起作用,所以我需要另一个建议。

  

再试一次......我回忆起我们谈到携带注释   委托方法......我们实际上已经实现了。它的   默认情况下不启用,因此您必须使用参数激活它   @Delegate注释:   http://groovy.codehaus.org/gapi/groovy/lang/Delegate.html#methodAnnotations

     

你可以试试@Delegate(methodAnnotations = true)吗?

实际的解决方案是:

class Reporter {
    @RequestMapping("report")
    public String doReport() {
        "report"
    }
}

@Controller
@RequestMapping("/a")
class AController {
    @Delegate(methodAnnotations = true) private Reporter = new Reporter

    @RequestMapping("b")
    public String doB() {
        "b"
    }
}

答案 1 :(得分:0)

当您使用注释映射请求时,会发生的情况是,一旦容器启动,它会扫描类路径,查找带注释的类和方法,并在内部构建映射,而不是手动编写部署描述符。

扫描程序从已编译的.class文件中读取方法和注释。也许Groovy mixins的实现方式是它们在运行时被解析,因此扫描器软件无法在编译的字节码中找到它们。

要解决此问题,您必须在编译时找到静态混合代码的方法,以便将带注释的方法实际写入类文件。