我正在尝试在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,所以这不是一个选项)?
答案 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的实现方式是它们在运行时被解析,因此扫描器软件无法在编译的字节码中找到它们。
要解决此问题,您必须在编译时找到静态混合代码的方法,以便将带注释的方法实际写入类文件。