2016-07-05 2 views
2

Попытка построить военный файл, как исполняемый и развертываемых во внешний контейнер, и я получаю эту ошибку:весна загрузки строите войны файл развертывания во внешний контейнер, ошибка: NoSuchBeanDefinitionException: Нет квалификационную боб типа

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'testController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.jusfoun.test.service.TestService com.jusfoun.test.controller.TestController.testService; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'testServiceImpl': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.jusfoun.test.dao.TestMapper] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@javax.annotation.Resource(shareable=true, lookup=, name=, description=, authenticationType=CONTAINER, type=class java.lang.Object, mappedName=)}

Он работает, когда запускается с помощью java -jar test.war

Проект:

enter image description here

pom.xml:

<project> 
    <properties> 
     <java.version>1.8</java.version> 
    </properties> 

    <dependencies> 

     <!--Quartz setting --> 
     <dependency> 
      <groupId>org.quartz-scheduler</groupId> 
      <artifactId>quartz</artifactId> 
      <version>2.2.1</version> 
     </dependency> 
     <!--junit setting --> 
     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>commons-lang</groupId> 
      <artifactId>commons-lang</artifactId> 
      <version>2.6</version> 
     </dependency> 

     <!-- datasource heroku --> 
     <dependency> 
      <groupId>com.zaxxer</groupId> 
      <artifactId>HikariCP-java6</artifactId> 
      <exclusions> 
       <exclusion> 
        <artifactId>tools</artifactId> 
        <groupId>com.sun</groupId> 
       </exclusion> 
      </exclusions> 
     </dependency> 
     <!-- aspectJ --> 
     <dependency> 
      <groupId>org.aspectj</groupId> 
      <artifactId>aspectjweaver</artifactId> 
     </dependency> 
     <!-- Spring boot --> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-web</artifactId> 
     </dependency> 
     <!-- Provided (for embedded war support) --> 
     <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-tomcat</artifactId> 
     <scope>provided</scope> 
     </dependency> 

     <!-- myBatis --> 
     <dependency> 
      <groupId>org.mybatis</groupId> 
      <artifactId>mybatis</artifactId> 
      <version>3.2.8</version> 
     </dependency> 
     <dependency> 
      <groupId>org.mybatis</groupId> 
      <artifactId>mybatis-spring</artifactId> 
      <version>1.2.2</version> 
     </dependency> 
     <dependency> 
      <groupId>org.mybatis.generator</groupId> 
      <artifactId>mybatis-generator-core</artifactId> 
      <version>1.3.2</version> 
     </dependency> 
     <dependency> 
      <groupId>mysql</groupId> 
      <artifactId>mysql-connector-java</artifactId> 
     </dependency> 
     <!-- mybatis pagehelper --> 
     <dependency> 
      <groupId>com.github.pagehelper</groupId> 
      <artifactId>pagehelper</artifactId> 
      <version>3.6.3</version> 
     </dependency> 
     <!-- Spring --> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-jdbc</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-tx</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-web</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.data</groupId> 
      <artifactId>spring-data-rest-webmvc</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-webmvc</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-test</artifactId> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework.data</groupId> 
      <artifactId>spring-data-commons</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.hateoas</groupId> 
      <artifactId>spring-hateoas</artifactId> 
     </dependency> 
     <!-- javax --> 
     <dependency> 
      <groupId>javax.inject</groupId> 
      <artifactId>javax.inject</artifactId> 
      <version>1</version> 
     </dependency> 
     <dependency> 
      <groupId>javax</groupId> 
      <artifactId>javaee-api</artifactId> 
      <version>7.0</version> 
      <scope>provided</scope> 
     </dependency> 

     <dependency> 
      <groupId>com.jcraft</groupId> 
      <artifactId>jsch</artifactId> 
      <version>0.1.53</version> 
     </dependency> 
     <dependency> 
      <groupId>net.sf.json-lib</groupId> 
      <artifactId>json-lib</artifactId> 
      <classifier>jdk15</classifier> 
      <version>2.4</version> 
     </dependency> 

     <!-- other service dependency package of jusfoun --> 

     <dependency> 
      <groupId>org.codehaus.jackson</groupId> 
      <artifactId>jackson-mapper-asl</artifactId> 
      <version>1.9.13</version> 
     </dependency> 

    </dependencies> 

    <build> 
     <sourceDirectory>src/main/java</sourceDirectory> 
     <plugins> 
     <plugin> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-maven-plugin</artifactId> 
      <executions> 
       <execution> 
        <goals> 
        <goal>repackage</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-surefire-plugin</artifactId> 
      <configuration> 
       <useSystemClassLoader>true</useSystemClassLoader> 
      </configuration> 
     </plugin> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <configuration> 
       <source>1.8</source> 
       <target>1.8</target> 
      </configuration> 
     </plugin> 
     <plugin> 
       <groupId>org.mybatis.generator</groupId> 
       <artifactId>mybatis-generator-maven-plugin</artifactId> 
       <version>1.3.2</version> 
       <configuration> 
        <verbose>true</verbose> 
        <overwrite>true</overwrite> 
       </configuration> 
      </plugin> 
     </plugins> 

    </build> 

    <packaging>war</packaging> 
</project> 

Application.java:

@Configuration 
@ComponentScan({"com.jusfoun.test"}) 
@EnableAutoConfiguration 
public class Application extends SpringBootServletInitializer { 

    public static void main(String[] args) { 
     SpringApplication.run(applicationClass, args); 
    } 

    @Override 
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { 
     return application.sources(applicationClass); 
    } 

    private static Class<Application> applicationClass = Application.class; 
} 

TestController.java

package com.jusfoun.test.controller; 
    @RestController 
@RequestMapping(value = "/test") 
public class TestController { 

    @Autowired 
    private TestService testService; 

    /** 
    * GET /test -> show test 
    */ 
    @RequestMapping(value = "/get", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) 
    public String test() { 
     System.out.println("teststestestsetstsetest"); 
     return testService.test(); 
    } 
} 

TestService.java

package com.jusfoun.test.service; 
public interface TestService { 
    String test(); 
} 

TestServiceImpl.java

package com.jusfoun.test.service.impl; 
@Service 
public class TestServiceImpl implements TestService { 

    @Resource 
    private TestMapper testMapper; 

    @Override 
    public String test() { 
     List<Test> tlist = testMapper.selectByExample(null); 
     JSONArray array = JSONArray.fromObject(tlist);   
     return array.toString(); 
    } 

} 

TestMapper.java

package com.jusfoun.test.dao; 
@Component 
public interface TestMapper { 
    ... 
} 

TestMapper.xml

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > 
<mapper namespace="com.jusfoun.test.dao.TestMapper" > 
    ... 

MapperClassNamePlugin

package com.jusfoun.test.dao.mybatis.plugin; 

import java.util.List; 
import org.mybatis.generator.api.IntrospectedTable; 
import org.mybatis.generator.api.PluginAdapter; 
public class MapperClassNamePlugin extends PluginAdapter { 

    public boolean validate(List<String> warnings) { 
     return true; 
    } 

    @Override 
    public void initialized(IntrospectedTable table) { 
     super.initialized(table); 

     table.setMyBatis3JavaMapperType(table.getMyBatis3JavaMapperType() 
       .replaceAll("Mapper$", "Dao")); 
    } 
} 

MapperXmlNamePlugin

package com.jusfoun.test.dao.mybatis.plugin; 

import java.util.List; 
import org.mybatis.generator.api.IntrospectedTable; 
import org.mybatis.generator.api.PluginAdapter; 
public class MapperXmlNamePlugin extends PluginAdapter { 

    public boolean validate(List<String> warnings) { 
     return true; 
    } 

    @Override 
    public void initialized(IntrospectedTable table) { 
     super.initialized(table); 

     table.setMyBatis3JavaMapperType(table.getMyBatis3JavaMapperType() 
       .replaceAll("Mapper", "")); 
    } 
} 

DataBaseConfiguration.java

@Configuration 
@EnableTransactionManagement 
public class DataBaseConfiguration implements EnvironmentAware { 

    private RelaxedPropertyResolver propertyResolver; 

    private static Logger log = LoggerFactory 
      .getLogger(DataBaseConfiguration.class); 

    private Environment env; 

    @Override 
    public void setEnvironment(Environment env) { 
     this.env = env; 
     this.propertyResolver = new RelaxedPropertyResolver(env, "jdbc."); 
    } 

    @Bean(destroyMethod = "shutdown") 
    public DataSource dataSource() { 
     log.debug("Configruing DataSource"); 
     if (propertyResolver.getProperty("url") == null 
       && propertyResolver.getProperty("databaseName") == null) { 
      log.error("Your database conncetion pool configuration is incorrct ! The application " 
        + "cannot start . Please check your jdbc"); 
      Arrays.toString(env.getActiveProfiles()); 
      throw new ApplicationContextException(
        "DataBase connection pool is not configured correctly"); 
     } 
     HikariConfig config = new HikariConfig(); 
     config.setDataSourceClassName(propertyResolver 
       .getProperty("dataSourceClassName")); 
     if (propertyResolver.getProperty("url") == null 
       || "".equals(propertyResolver.getProperty("url"))) { 
      config.addDataSourceProperty("databaseName", 
        propertyResolver.getProperty("databaseName")); 
      config.addDataSourceProperty("serverName", 
        propertyResolver.getProperty("serverName")); 
     } else { 
      config.addDataSourceProperty("url", 
        propertyResolver.getProperty("url")); 
     } 
     config.setUsername(propertyResolver.getProperty("username")); 
     config.setPassword(propertyResolver.getProperty("password")); 
     if ("com.mysql.jdbc.jdbc2.optional.MysqlDataSource" 
       .equals(propertyResolver.getProperty("dataSourceName"))) { 
      config.addDataSourceProperty("cachePrepStmts", 
        propertyResolver.getProperty("cachePrepStmts")); 
      config.addDataSourceProperty("prepStmtCacheSize", 
        propertyResolver.getProperty("prepStmtsCacheSize")); 
      config.addDataSourceProperty("prepStmtCacheSqlLimit", 
        propertyResolver.getProperty("prepStmtCacheSqlLimit")); 
      config.addDataSourceProperty("userServerPrepStmts", 
        propertyResolver.getProperty("userServerPrepStmts")); 
     } 
     return new HikariDataSource(config); 
    } 

} 

MybatisConfiguration.java

@Configuration 
@ConditionalOnClass({ EnableTransactionManagement.class, EntityManager.class }) 
@AutoConfigureAfter({ DataBaseConfiguration.class }) 
@MapperScan(basePackages={"com.jusfoun.test.dao"}) 
public class MybatisConfiguration implements EnvironmentAware { 

    private static Log logger = LogFactory.getLog(MybatisConfiguration.class); 

    private RelaxedPropertyResolver propertyResolver; 

    @Inject 
    private DataSource dataSource; 

    @Override 
    public void setEnvironment(Environment environment) { 
     this.propertyResolver = new RelaxedPropertyResolver(environment,"mybatis."); 
    } 

    @Bean 
    @ConditionalOnMissingBean 
    public SqlSessionFactory sqlSessionFactory() { 
     try { 
      SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); 
      sessionFactory.setDataSource(dataSource); 
      sessionFactory.setTypeAliasesPackage(propertyResolver 
        .getProperty("typeAliasesPackage")); 
      sessionFactory 
        .setMapperLocations(new PathMatchingResourcePatternResolver() 
          .getResources(propertyResolver 
            .getProperty("mapperLocations"))); 
      sessionFactory 
        .setConfigLocation(new DefaultResourceLoader() 
          .getResource(propertyResolver 
            .getProperty("configLocation"))); 

      return sessionFactory.getObject(); 
     } catch (Exception e) { 
      logger.warn("Could not confiure mybatis session factory"); 
      return null; 
     } 
    } 

    @Bean 
    @ConditionalOnMissingBean 
    public DataSourceTransactionManager transactionManager() { 
     return new DataSourceTransactionManager(dataSource); 
    } 
} 
+0

в pom.xml, есть война simonLi

+1

Что заставили вас включить эти конкретные файлы в вашем вопросе?В сообщениях об ошибках упоминаются «TestController», «testServiceImpl», «TestMapper», ни один из которых не отображается в коде, который вы включили. – kryger

+0

Поскольку «TestController», «testServiceImpl», «TestMapper» хорошо работают в IDE и java -jar-методе. Я предполагаю, что это может быть ошибка pom или application. Теперь я добавляю эти файлы в вопрос. И когда я удаляю TestMapper, он работает во внешнем tomcat, я не знаю почему. пожалуйста, помогите, спасибо. – simonLi

ответ

0

я удалить аннотацию @ConditionalOnClass в MybatisConfiguration. Проект работает, когда война развертывается во внешний контейнер (tomcat8). Перед удалением аннотации он работает с java -jar xxx.war, но не работает, развертывается во внешний tomcat.

@Configuration 
@AutoConfigureAfter({ DataBaseConfiguration.class }) 
@MapperScan(basePackages={"com.jusfoun.test.dao"}) 
public class MybatisConfiguration implements EnvironmentAware { 
0

Использование mybatis-пружинный загрузочный стартер (https://github.com/mybatis/spring-boot-starter), ваша установка может быть упрощена следующим:

Вытащите DataBaseConfiguration и MybatisConfiguration (что будет сделано mybatis-spring-boot-starter.

Modifiy TestMapper:

package com.jusfoun.test.dao; 
@Mapper 
public interface TestMapper { 
    ... 
} 
+0

добавить зависимость ( org.mybatis.spring.boot mybatis-пружинными загрузки стартера 1.1.1 ), удалены DataBaseConfiguration и MybatisConfiguration. Но TestMapper add @Mapper есть ошибка (не удается разрешить символ «Mapper»). – simonLi

+0

import org.apache.ibatis.annotations.Mapper; ? –

+0

'Mapper' это нормально после удаления dependenies ( org.mybatis mybatis 3.2.8 org.mybatis mybatis пружинный 1.2.2 ). – simonLi

Смежные вопросы