- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在尝试对 spring 和我的 Java Web Servlet 使用新的基于 Java 的注释配置。我目前在 servlet 本身内部使用 @Autowired 注释时遇到问题,但我不确定这是我的配置文件问题还是我使用 AbstractAnnotationConfigDispatcherServletInitializer 引导 servlet 配置时的失误。
我搜索了论坛,并认为我已经使用以下代码片段找到了答案:
public void init(ServletConfig config) {
super.init(config);
SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this,config.getServletContext());
}
然而,在调试时,“ServletConfig”上下文似乎为空,并且由于没有注册 bean 而导致以下错误:
org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.fdmgroup.bookshop.service.BookService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1486)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1104)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:585)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.processInjection(AutowiredAnnotationBeanPostProcessor.java:387)
at org.springframework.web.context.support.SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(SpringBeanAutowiringSupport.java:110)
at com.fdmgroup.bookshop.controller.HomeController.init(HomeController.java:46)
at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1183)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1099)
at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:779)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:133)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:474)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:624)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:349)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:783)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:798)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1434)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)
我目前不确定 @ComponentScan 是否在我的 WebConfig 类中未正确激活、ServletConfig 上下文未正确加载,或者是否有其他原因在起作用。任何帮助将不胜感激!
WebServlet:
@WebServlet("/")
public class HomeController extends HttpServlet {
private static final long serialVersionUID = 1L;
@Autowired
private BookService bookService;
public HomeController() {
}
public HomeController(BookService bookService) {
this.bookService = bookService;
}
public void init(ServletConfig config) throws ServletException {
super.init(config);
SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this,config.getServletContext());
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
List<Book> books = bookService.retrieveAllBooks();
request.setAttribute("books", books);
request.getRequestDispatcher("/WEB-INF/index.jsp").forward(request, response);
}
Java 配置文件:
public class ServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getServletConfigClasses() {
System.out.println("in Servlet Initializer");
return new Class[] { WebConfig.class };
}
@Override
protected String[] getServletMappings() {
return new String[] { "/" };
}
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[] { RootConfig.class };
}
}
WebConfig.class:
@Configuration
@EnableWebMvc
@ComponentScan({ "com.fdmgroup.bookshop" })
public class WebConfig extends WebMvcConfigurerAdapter {
}
RootConfig.class:
@Configurable
public class RootConfig {
}
BookService.class:
@Service
public class BookService {
@Autowired
private CRUD<Book> bookRepository;
public BookService(CRUD<Book> bookRepository) {
this.bookRepository = bookRepository;
}
public BookService() {
}
public void createBook (Book book){
bookRepository.create(book);
}
public Book retrieveBook (long id){
return bookRepository.retrieve(id);
}
public void deleteBook (long id){
bookRepository.delete(id);
}
public List<Book> retrieveAllBooks (){
return bookRepository.retrieveAll();
}
}
谢谢!
最佳答案
对于遇到类似问题的任何人,由于这篇优秀的文章,我设法解决了自己的问题: getservletconfigclasses-vs-getrootconfigclasses
这个问题确实与 @ComponentScan 相关,因为我没有意识到 WebConfig 只扫描 Servlet WebApplicationContext 中的 bean,并且根 WebApplicationContext 是完全单独处理的。有了这种新理解的解决方案非常简单,在 RootConfig.class 中添加第二个 @ComponentScan:
@Configurable
@ComponentScan({ "com.fdmgroup.bookshop" })
public class RootConfig {
}
关于java - 使用 AbstractAnnotationConfigDispatcherServletInitializer 在 java servlet 中使用 @Autowire,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44985831/
我知道我可以通过这种方式向两个调度程序 servlet 写入一个根上下文: @覆盖public void onStartup(ServletContext servletContext) 抛出 Ser
我正在尝试为我的基于 Spring 3.2.8 的纯 Java 配置应用程序添加安全性。我正在按照说明 http://docs.spring.io/spring-security/site/docs/
我在将 CommonsMultipartResolver bean 与扩展 AbstractAnnotationConfigDispatcherServletInitializer 的初始化器结合使用
我正在尝试配置 spring maven 多模块项目。我有two调度程序 Servlet(例如 Foo {Module A}、Bar {Module B})位于两个子 web 模块中。我想做的就是配置
出于某种原因,maven 没有构建 AbstractAnnotationConfigDispatcherServletInitializer 类。下面是我的 pom.xml 的相关部分,其中包含必要的
问题是:我可以成功注册过滤器,但不知道如何使用此特定配置设置映射 URL。 这是我的类(class): public class WebInitializer extends Abst
我正在使用 Jetty 9.1.0.RC2 和 Spring 4。 有一个 AbstractAnnotationConfigDispatcherServletInitializer并尝试启动初始化:
我正在使用 Spring 4.0.7 我做了一个关于通过 JavaConfig 配置 Spring MVC 的研究。 实际上直到昨天我才看到使用这两个选项的两种配置 扩展 AbstractAnnota
我正在使用 AbstractAnnotationConfigDispatcherServletInitializer配置我的网络应用程序。我也有一个 @Configuration我用来创建一些 bea
我从 Spring Boot 项目中找到了“TomcatEmbeddedServletContainerFactory”,它可以创建一个 Tomcat 嵌入式实例。我已经有一组“传统的”Spring(
在扩展类 AbstractAnnotationConfigDispatcherServletInitializer 时,您将如何设置“事件配置文件”属性? 最佳答案 根据您要设置的上下文的配置文件,一
每个函数的目的是什么。为什么spring给配置类赋予了两种不同的功能?我对两者感到困惑,我应该使用哪一个? 最佳答案 在典型的 Spring 应用程序中,有 2 ApplicationContext例
我正在使用没有 XML 配置的 Spring 3.2.5。我正在使用 AbstractAnnotationConfigDispatcherServletInitializer 来初始化我的应用程序,并
我有一个基于纯 Java 配置的 Spring 3.2 应用程序。当我使用“mvn jetty:run”启动应用程序时,一切正常。但是当我在 Jetty(9.0.2) 或 Tomcat(7.0) 中部
getServletConfigClasses() 与 getRootConfigClasses() 有什么区别AbstractAnnotationConfigDispatcherServletIni
我目前正在尝试对 spring 和我的 Java Web Servlet 使用新的基于 Java 的注释配置。我目前在 servlet 本身内部使用 @Autowired 注释时遇到问题,但我不确定这
我在 Spring 上有一个应用程序并使用 Java Configs 来配置和初始化我的应用程序,所以我没有 web.xml .这是我的网络初始化器的样子, public class WebIniti
我使用 Spring 工具套件创建了一个 Spring MVC web 应用程序,我正在尝试创建此类,但是当我执行 import 时,我收到此错误: The import org.springfram
我正在尝试实现自定义 Controller 来处理自定义存储库中定义的方法,以便能够使用此方法通过 REST 公开资源(根据 Implementing custom methods of Spring
我在我的项目中有一个 SiteMeshFilter 的工作实现,但是自从转向扩展 AbstractAnnotationConfigDispatcherServletInitializer 而不是 We
我是一名优秀的程序员,十分优秀!