HTTP Status 500 - Servlet.init() for servlet viewspace threw exception type Exception report

因为要求命名规范,所以我将IServiceImpl.java文件直接改名为SubServiceImpl,运行时报出500错误,在网上查了说是tomcat的问题,但是我将配置弄好之后依旧是这个问题。烦请解答。
项目结构如下:
图片说明

网页报错内容:

HTTP Status 500 - Servlet.init() for servlet viewspace threw exception
type Exception report

message Servlet.init() for servlet viewspace threw exception

description The server encountered an internal error that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: Servlet.init() for servlet viewspace threw exception
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:474)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:624)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:349)
    org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:495)
    org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:767)
    org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1347)
    org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    java.lang.Thread.run(Unknown Source)
root cause

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'subServiceImpl': Unsatisfied dependency expressed through field 'subDAO': No qualifying bean of type [org.alex.samples.dao.ISubDAO] is defined: expected single matching bean but found 2: subDAOImpl,SubDAOImpl; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [org.alex.samples.dao.ISubDAO] is defined: expected single matching bean but found 2: subDAOImpl,SubDAOImpl
    org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:569)
    org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
    org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:349)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1214)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
    org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
    org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
    org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
    org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:776)
    org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:861)
    org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:541)
    org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:668)
    org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:634)
    org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:682)
    org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:553)
    org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:494)
    org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136)
    javax.servlet.GenericServlet.init(GenericServlet.java:158)
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:474)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:624)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:349)
    org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:495)
    org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:767)
    org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1347)
    org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    java.lang.Thread.run(Unknown Source)
root cause

org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [org.alex.samples.dao.ISubDAO] is defined: expected single matching bean but found 2: subDAOImpl,SubDAOImpl
    org.springframework.beans.factory.config.DependencyDescriptor.resolveNotUnique(DependencyDescriptor.java:172)
    org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1065)
    org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1019)
    org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:566)
    org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
    org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:349)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1214)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
    org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
    org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
    org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
    org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:776)
    org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:861)
    org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:541)
    org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:668)
    org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:634)
    org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:682)
    org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:553)
    org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:494)
    org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136)
    javax.servlet.GenericServlet.init(GenericServlet.java:158)
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:474)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:624)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:349)
    org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:495)
    org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:767)
    org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1347)
    org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    java.lang.Thread.run(Unknown Source)
note The full stack trace of the root cause is available in the Apache Tomcat/9.0.0.M17 logs.

Apache Tomcat/9.0.0.M17

SubServiceImpl.java代码内容

package org.alex.samples.service;

import java.util.List;

import org.alex.samples.dao.ISubDAO;
import org.alex.samples.model.Sub;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class SubServiceImpl implements ISubService {

    @Autowired
    private ISubDAO subDAO;

    @Override
    public List<Sub> findAllSubs() {
        return subDAO.findAllSubs();
    }

    @Override
    public void createSub(Sub sub) throws Exception{
         subDAO.createSub(sub);
    };

    @Override
    public void editSub(Sub sub) throws Exception{
        subDAO.editSub(sub);
    }   

    @Override
    public void deleteSub(int id){
        subDAO.deleteSub(id);
    }

    @Override
    public Sub getSubById(int id) {
        return subDAO.getSubById(id);
    }
}

SubDAOImpl.java代码内容

package org.alex.samples.dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import org.alex.samples.model.Sub;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;

@Repository
public class SubDAOImpl implements ISubDAO{

    static final String SQL_SELECT_SUBJECT = "select * from exam_subject";
    static final String SQL_INSERT_SUBJECT = "insert exam_subject(sub_id,name,description,test_count,total_time,total_score,status) value(?,?,?,?,?,?,?)";
    static final String SQL_SELECT_SUBJECT_BYID = "select * from exam_subject where sub_id = ?";
    static final String SQL_UPDATE_SUBJECT = "update exam_subject set name = ?,description = ?,test_count = ?,total_time = ?,total_score = ?,status =? where sub_id = ?";
    static final String SQL_DELETE_SUBJECT = "delete from exam_subject where sub_id = ?";

    private JdbcTemplate jdbcTemplate;

    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    private static final class subMapper implements RowMapper<Sub> {
        public Sub mapRow(ResultSet rs, int num) throws SQLException {
            Sub sub = new Sub();
            sub.setSubID(rs.getInt("sub_id"));
            sub.setSubName(rs.getString("name"));
            sub.setDescription(rs.getString("description"));
            sub.setTestCount(rs.getInt("test_count"));
            sub.setTotalTime(rs.getInt("total_time"));
            sub.setTotalScore(rs.getDouble("total_score"));
            sub.setStatus(rs.getInt("status"));
            return sub;
        }
    };

    @Override
    public List<Sub> findAllSubs() {
        return jdbcTemplate.query(SQL_SELECT_SUBJECT, new subMapper());
    }

    @Override
    public void createSub(Sub sub) throws Exception {
        if (sub != null && getSubById(sub.getSubID()) == null) {
            jdbcTemplate.update(SQL_INSERT_SUBJECT,new Object[] {sub.getSubID(),sub.getSubName(),sub.getDescription(),
            sub.getTestCount(),sub.getTotalTime(), sub.getTotalScore(),sub.getStatus()});
        }
    }

    @Override
    public void editSub(Sub sub) throws Exception {
        jdbcTemplate.update(SQL_UPDATE_SUBJECT, new Object[] {sub.getSubName(),sub.getDescription(),sub.getTestCount(),
        sub.getTotalTime(), sub.getTotalScore(),sub.getStatus(),sub.getSubID()});
    }

    @Override
    public void deleteSub(int id) {
        jdbcTemplate.update(SQL_DELETE_SUBJECT, new Object[] { id });
    }

    @Override
    public Sub getSubById(int id) {
        List<Sub> sub = jdbcTemplate.query(SQL_SELECT_SUBJECT_BYID, new Object[] { id }, new subMapper());
        if(sub != null && sub.size() > 0){
                return sub.get(0);
        }
        return null;
    }
}

在subServiceImpl里面改一下subDAOImpl或SubDAOImpl的引用

SubServiceImpl初始化接口ISubDAO时找不到唯一的bean,因为该接口存在两个bean:subDAOImpl,SubDAOImpl,找找是SubDAOImpl在哪里初始化多了一个bean,一个是@Service注解的,还有一个就不知道是哪里,你的xml中另外写了一个?