繁体   English   中英

我应该如何在Spring MVC中创建Groovy控制器

[英]How should I create Groovy controller in Spring MVC

我已经看到了这个问题,我无法在我的Spring MVC项目中使用Groovy。 我应该保留在哪里,完整路径应该是什么? 请原谅我一个基本的问题,但是我必须在Spring MVC中开始使用Groovy。 Groovy在Spring 4.0 Snapshot中可用,根据官方网站,最终版本应该在12月发布。 但是现在,建议使用4.0版吗? (它具有对Groovy的内置支持)

参考代码:

    <beans .........
...
...
      <bean class="full.qualified.name.of.ProxyAwareAnnotationMethodHandlerAdapter" />
...
...
      <lang:groovy script-source="classpath:com/example/mysample.groovy refresh-check-delay="1000" />
</beans>

Java类如下:

//ProxyAwareAnnotationMethodHandlerAdapter.java

    package name.assafberg.spring;

    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    import org.springframework.aop.TargetSource;
    import org.springframework.aop.framework.Advised;
    import org.springframework.web.servlet.ModelAndView;
    import org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter;

    /**
     * Add proxy awareness to <code>AnnotationMethodHandlerAdapter</code>.
     * 
     * @author assaf
     */
    public class ProxyAwareAnnotationMethodHandlerAdapter extends AnnotationMethodHandlerAdapter {

        /**
         * @param request
         * @param response
         * @param handler
         * @return
         * @throws Exception
         * @see org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter#handle(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, java.lang.Object)
         */
        @Override
        public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            handler = unwrapHandler(handler);

            return super.handle(request, response, handler);
        }

        /**
         * @param handler
         * @return
         * @see org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter#supports(java.lang.Object)
         */
        @Override
        public boolean supports(Object handler) {
            handler = unwrapHandler(handler);

            return super.supports(handler);
        }

        /**
         * Attempt to unwrap the given handler in case it is an AOP proxy
         * 
         * @param handler
         * @return Object
         */
        private Object unwrapHandler(Object handler) {
            if (handler instanceof Advised) {
                try {
                    TargetSource targetSource = ((Advised) handler).getTargetSource();
                    return targetSource.getTarget();

                } catch (Exception x) {
                    throw new RuntimeException(x);
                }

            } else {
                return handler;     
            }       
        }

    }

编辑

无需处理上述文件。 我唯一要注意的是Groovy版本。 确保从命令行确保Groovy的版本与“类路径”添加的版本相同。 而且有效。 几乎不需要任何配置。 刚刚创建了一个.groovy类而不是Java类(感谢+ kunal的启发。)

@Controller
class TestController {
     @Autowired
     @RequestMapping(value = "/welcome", method = RequestMethod.GET)
     String People() {

                return "people"
            }

    }

然后我在想出一种创建Groovy控制器的方法时就问了这个问题

Groovy控制器在一个实际的应用程序中为我出色地工作,该应用程序现已投入生产一年以上。 为了帮助人们在Spring MVC项目中看到groovy的价值,我分叉了Heroku的示例Java应用程序,并重写了groovy中的控制器。 请在此处签出项目:

https://github.com/kdabir/groovy-springmvc-sample

同样,查看历史记录以了解在现有的Java项目中如何引入groovy也会很有趣。 尽管从那时起我还没有涉及那个项目,但是它应该为您提供一个入门的思路。

编辑:

澄清一下,您只需将.java文件转换为.groovy ,它就可以工作(只要它是有效的groovy语法)。

在重新加载groovy时,直接使用groovy编写spring-mvc控制器应该会导致一些cglib错误。 因此,您可以尝试使用使用jdk代理控制器接口的解决方案,该接口与spring注释一起单独使用,例如@RequestMapping @RestController @ResponseBody

这个jdk代理可以链接一个Groovy对象来执行。 您可以创建弹簧扫描以扫描代理接口,您可以从micro-mvc lib中查看示例。

https://github.com/jeffreyning/micro-mvc https://github.com/jeffreyning/nh-micro

扫描显示在GroovyScanner ,代理显示在InjectGroovyProxy

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM