1

我已经看到了这个问题,我无法让 Groovy 在我的 Spring MVC 项目中工作。我应该把它放在哪里,完整的路径应该是什么?请原谅我的基本问题,但我必须开始在 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"
            }

    }
4

2 回答 2

4

那时我在想办法创建 Groovy 控制器时问过这个问题。

Groovy 控制器在一个已经投入生产一年多的真实应用程序中为我工作得非常好。只是为了帮助人们在 Spring MVC 项目中看到 groovy 的价值,我分叉了 Heroku 的示例 java 应用程序并用 groovy 重写了控制器。请在此处查看项目:

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

此外,查看历史以了解如何在现有 java 项目中引入 groovy 也会很有趣。虽然从那以后我没有接触过那个项目,但它应该让你对如何开始有一个公平的想法。

编辑:

只是为了澄清,您只需将.java文件转换为.groovy它应该可以工作(只要它是有效的常规语法)。

于 2013-10-24T08:28:09.593 回答
1

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

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

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

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

于 2018-11-02T06:01:10.670 回答