我有一个关于grails的玩具项目,其主要思想是在运行时将用户组件加载到应用程序中。 根据我的想法,用户在我的Web应用程序中将自己的bean(控制器和服务)作为DSL bean集编写,然后按下按钮,该文件中的bean将加载到应用程序上下文中。目前我可以使用AC加载和连接这些bean,但是grails并不将它们视为控制器。我想在grails应用程序中有两种策略可以找到控制器:grails扫描位于某些" magic"中的bean。文件夹,连接它们并假设此bean的所有方法都是requestmappings。查找控制器的第二种方法是使用@Controller和@RequestMapping对它们进行注释。这就是我不知道该怎么做的事情。 当我使用@Controller注释这些DSL bean并连接它们时,它们确实出现在控制器列表中,这样克制了
package ealo;
import java.util.Map;
import java.util.Map.Entry;
import javax.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
public class ControllerLister {
@Autowired
private RequestMappingHandlerMapping requestMappingHandlerMapping;
//@PostConstruct
public void init1() {
Map<RequestMappingInfo, HandlerMethod> handlerMethods
= this.requestMappingHandlerMapping.getHandlerMethods();
//System.out.println("111 "+handlerMethods);
for (Entry<RequestMappingInfo, HandlerMethod> item : handlerMethods.entrySet()) {
RequestMappingInfo mapping = item.getKey();
HandlerMethod method = item.getValue();
// System.out.println("111");
for (String urlPattern : mapping.getPatternsCondition().getPatterns()) {
System.out.println(
method.getBeanType().getName() + "#" + method.getMethod().getName()
+ " <-- " + urlPattern);
if (urlPattern.equals("some specific url")) {
//add to list of matching METHODS
}
}
}
}
}
但只有在运行时更改项目中的某些内容时才会发生这种情况。我想grails会在那一刻重新扫描组件。无论如何,即使我看到列出这些bean,我也无法向他们发出任何请求,获得404.如果没有注释豆类,我甚至看不到它们列出。
我需要一个想法如何解决这个问题grails方式或注释方式。 Grails的方式是优先考虑的。提前谢谢。