Spring boot failing to start rest service
Solution 1
If you are using spring-boot, add the dependency below in order to use autoconfiguration
pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
In your application.properties
spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
spring.datasource.url=jdbc:oracle:thin:@testserver.com:2126:QADBA9FU
spring.datasource.username=test
spring.datasource.password=password123
EDIT 1
Remove this in yout EmployeeController
ApplicationContext ctx = new FileSystemXmlApplicationContext("/Users/sijayaraman/Documents/workspace/luna/CopyofSpringRest/sbeans.xml");
EmployeeDao dao=(EmployeeDaoImpl)ctx.getBean("employeedao");
instead use
@Autowired
private EmployeeDao dao;
Also, annotate class
@Component
public class EmployeeDaoImpl ...
EDIT 02
Download the ojdbc6.jar from http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-112010-090769.html and install in your maven local repository
mvn install:install-file -Dfile={Path/to/your/ojdbc.jar} -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=11.2.0 -Dpackaging=jar
Then change your oracle dependency by
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0</version>
</dependency>
Solution 2
It might not be the root of your problem, but you are not accessing your dao correctly. The main principle of Spring is Dependency Injection, which means Controller
should not be getting it's DAO. Instead it should be either autowired or set in the config file.
Then you Controller
would look like this:
@RestController
public class EmployeeController {
@Autowired
EmployeeDao dao;
@RequestMapping("/employee")
public Employee employee(@RequestParam(value="name") String name) {
System.out.println("Count="+dao.getTotalCount());
return new Employee(dao.getTotalCount(),name);
}
}
You will need to add the sbeans.xml
to the configuration. Try adding
@ImportXml("classpath:sbeans.xml")
to Application.java
:
@SpringBootApplication
@ImportXml("classpath:sbeans.xml")
public class Application
or better yet rewrite sbeans.xml
in Java.
Solution 3
You are getting -
Caused by: java.lang.NoClassDefFoundError: org/aopalliance/aop/Advice
So fix this first with -
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
Comments
-
Sivasakthi Jayaraman almost 2 years
I tried to simulate the RESTful Web Service from the spring home page "https://spring.io/guides/gs/rest-service/". I am able to get the expected output for the given example, so i did a little enhancement i.e tried to fetch some count from the oracle database and display as part of response but it didn't work.
Maven compilation works fine but when i run the spring boot i am getting the below error, i don't know what could be the reason. I am new to spring, can someone help me?
My configuration details are
Mac 10.9
EclipseLuna 4.4.1
Java-8
maven3.2.1
spring 3.6Spring Boot Error:
:: Spring Boot :: (v1.2.2.RELEASE) 2015-03-11 18:36:25.862 INFO 7298 --- [ main] com.test.Application : Starting Application on LM-MAA-00668611 with PID 7298 (/Users/sijayaraman/Documents/workspace/luna/CopyofSpringRest/target/classes started by sijayaraman in /Users/sijayaraman/Documents/workspace/luna/CopyofSpringRest) 2015-03-11 18:36:25.900 INFO 7298 --- [ main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@5427c60c: startup date [Wed Mar 11 18:36:25 IST 2015]; root of context hierarchy 2015-03-11 18:36:26.366 INFO 7298 --- [ main] o.s.b.f.s.DefaultListableBeanFactory : Overriding bean definition for bean 'beanNameViewResolver': replacing [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration$WhitelabelErrorViewConfiguration; factoryMethodName=beanNameViewResolver; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/autoconfigure/web/ErrorMvcAutoConfiguration$WhitelabelErrorViewConfiguration.class]] with [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter; factoryMethodName=beanNameViewResolver; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/autoconfigure/web/WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter.class]] 2015-03-11 18:36:26.405 INFO 7298 --- [ main] .b.l.ClasspathLoggingApplicationListener : Application failed to start with classpath: [file:/Users/sijayaraman/Documents/workspace/luna/CopyofSpringRest/target/classes/, file:/Users/sijayaraman/.m2/maven.repo/org/springframework/boot/spring-boot-starter-web/1.2.2.RELEASE/spring-boot-starter-web-1.2.2.RELEASE.jar, file:/Users/sijayaraman/.m2/maven.repo/org/springframework/boot/spring-boot-starter/1.2.2.RELEASE/spring-boot-starter-1.2.2.RELEASE.jar, file:/Users/sijayaraman/.m2/maven.repo/org/springframework/boot/spring-boot/1.2.2.RELEASE/spring-boot-1.2.2.RELEASE.jar, file:/Users/sijayaraman/.m2/maven.repo/org/springframework/boot/spring-boot-autoconfigure/1.2.2.RELEASE/spring-boot-autoconfigure-1.2.2.RELEASE.jar, file:/Users/sijayaraman/.m2/maven.repo/org/springframework/boot/spring-boot-starter-logging/1.2.2.RELEASE/spring-boot-starter-logging-1.2.2.RELEASE.jar, file:/Users/sijayaraman/.m2/maven.repo/org/slf4j/jcl-over-slf4j/1.7.10/jcl-over-slf4j-1.7.10.jar, file:/Users/sijayaraman/.m2/maven.repo/org/slf4j/slf4j-api/1.7.10/slf4j-api-1.7.10.jar, file:/Users/sijayaraman/.m2/maven.repo/org/slf4j/jul-to-slf4j/1.7.10/jul-to-slf4j-1.7.10.jar, file:/Users/sijayaraman/.m2/maven.repo/org/slf4j/log4j-over-slf4j/1.7.10/log4j-over-slf4j-1.7.10.jar, file:/Users/sijayaraman/.m2/maven.repo/ch/qos/logback/logback-classic/1.1.2/logback-classic-1.1.2.jar, file:/Users/sijayaraman/.m2/maven.repo/ch/qos/logback/logback-core/1.1.2/logback-core-1.1.2.jar, file:/Users/sijayaraman/.m2/maven.repo/org/yaml/snakeyaml/1.14/snakeyaml-1.14.jar, file:/Users/sijayaraman/.m2/maven.repo/org/springframework/boot/spring-boot-starter-tomcat/1.2.2.RELEASE/spring-boot-starter-tomcat-1.2.2.RELEASE.jar, file:/Users/sijayaraman/.m2/maven.repo/org/apache/tomcat/embed/tomcat-embed-core/8.0.20/tomcat-embed-core-8.0.20.jar, file:/Users/sijayaraman/.m2/maven.repo/org/apache/tomcat/embed/tomcat-embed-el/8.0.20/tomcat-embed-el-8.0.20.jar, file:/Users/sijayaraman/.m2/maven.repo/org/apache/tomcat/embed/tomcat-embed-logging-juli/8.0.20/tomcat-embed-logging-juli-8.0.20.jar, file:/Users/sijayaraman/.m2/maven.repo/org/apache/tomcat/embed/tomcat-embed-websocket/8.0.20/tomcat-embed-websocket-8.0.20.jar, file:/Users/sijayaraman/.m2/maven.repo/com/fasterxml/jackson/core/jackson-databind/2.4.5/jackson-databind-2.4.5.jar, file:/Users/sijayaraman/.m2/maven.repo/com/fasterxml/jackson/core/jackson-annotations/2.4.5/jackson-annotations-2.4.5.jar, file:/Users/sijayaraman/.m2/maven.repo/com/fasterxml/jackson/core/jackson-core/2.4.5/jackson-core-2.4.5.jar, file:/Users/sijayaraman/.m2/maven.repo/org/hibernate/hibernate-validator/5.1.3.Final/hibernate-validator-5.1.3.Final.jar, file:/Users/sijayaraman/.m2/maven.repo/javax/validation/validation-api/1.1.0.Final/validation-api-1.1.0.Final.jar, file:/Users/sijayaraman/.m2/maven.repo/org/jboss/logging/jboss-logging/3.1.3.GA/jboss-logging-3.1.3.GA.jar, file:/Users/sijayaraman/.m2/maven.repo/com/fasterxml/classmate/1.0.0/classmate-1.0.0.jar, file:/Users/sijayaraman/.m2/maven.repo/org/springframework/spring-core/4.1.5.RELEASE/spring-core-4.1.5.RELEASE.jar, file:/Users/sijayaraman/.m2/maven.repo/org/springframework/spring-web/4.1.5.RELEASE/spring-web-4.1.5.RELEASE.jar, file:/Users/sijayaraman/.m2/maven.repo/org/springframework/spring-aop/4.1.5.RELEASE/spring-aop-4.1.5.RELEASE.jar, file:/Users/sijayaraman/.m2/maven.repo/aopalliance/aopalliance/1.0/aopalliance-1.0.jar, file:/Users/sijayaraman/.m2/maven.repo/org/springframework/spring-context/4.1.5.RELEASE/spring-context-4.1.5.RELEASE.jar, file:/Users/sijayaraman/.m2/maven.repo/org/springframework/spring-webmvc/4.1.5.RELEASE/spring-webmvc-4.1.5.RELEASE.jar, file:/Users/sijayaraman/.m2/maven.repo/org/springframework/spring-expression/4.1.5.RELEASE/spring-expression-4.1.5.RELEASE.jar, file:/Users/sijayaraman/.m2/maven.repo/org/springframework/spring-jdbc/4.1.5.RELEASE/spring-jdbc-4.1.5.RELEASE.jar, file:/Users/sijayaraman/.m2/maven.repo/org/springframework/spring-beans/4.1.5.RELEASE/spring-beans-4.1.5.RELEASE.jar, file:/Users/sijayaraman/.m2/maven.repo/org/springframework/spring-tx/4.1.5.RELEASE/spring-tx-4.1.5.RELEASE.jar, file:/Users/sijayaraman/.m2/maven.repo/com/oracle/ojdbc5/11.2.0.1.0/ojdbc5-11.2.0.1.0.jar] 2015-03-11 18:36:26.411 ERROR 7298 --- [ main] o.s.boot.SpringApplication : Application startup failed java.lang.IllegalStateException: Could not evaluate condition on org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration#transactionManager due to internal class not found. This can happen if you are @ComponentScanning a springframework package (e.g. if you put a @ComponentScan in the default package by mistake) at org.springframework.boot.autoconfigure.condition.SpringBootCondition.matches(SpringBootCondition.java:51) at org.springframework.context.annotation.ConditionEvaluator.shouldSkip(ConditionEvaluator.java:102) at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForBeanMethod(ConfigurationClassBeanDefinitionReader.java:194) at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForConfigurationClass(ConfigurationClassBeanDefinitionReader.java:148) at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitions(ConfigurationClassBeanDefinitionReader.java:124) at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:318) at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:239) at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:254) at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:94) at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:606) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:462) at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118) at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:686) at org.springframework.boot.SpringApplication.run(SpringApplication.java:320) at org.springframework.boot.SpringApplication.run(SpringApplication.java:957) at org.springframework.boot.SpringApplication.run(SpringApplication.java:946) at com.test.Application.main(Application.java:11) Caused by: java.lang.NoClassDefFoundError: org/aopalliance/aop/Advice at java.lang.Class.getDeclaredMethods0(Native Method) at java.lang.Class.privateGetDeclaredMethods(Class.java:2688) at java.lang.Class.getDeclaredMethods(Class.java:1962) at org.springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:571) at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:490) at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:474) at org.springframework.util.ReflectionUtils.getUniqueDeclaredMethods(ReflectionUtils.java:534) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getTypeForFactoryMethod(AbstractAutowireCapableBeanFactory.java:677) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineTargetType(AbstractAutowireCapableBeanFactory.java:621) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.predictBeanType(AbstractAutowireCapableBeanFactory.java:591) at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:1397) at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:968) at org.springframework.boot.autoconfigure.condition.BeanTypeRegistry$OptimizedBeanTypeRegistry.addBeanTypeForNonAliasDefinition(BeanTypeRegistry.java:257) at org.springframework.boot.autoconfigure.condition.BeanTypeRegistry$OptimizedBeanTypeRegistry.addBeanType(BeanTypeRegistry.java:246) at org.springframework.boot.autoconfigure.condition.BeanTypeRegistry$OptimizedBeanTypeRegistry.getNamesForType(BeanTypeRegistry.java:227) at org.springframework.boot.autoconfigure.condition.OnBeanCondition.collectBeanNamesForType(OnBeanCondition.java:158) at org.springframework.boot.autoconfigure.condition.OnBeanCondition.getBeanNamesForType(OnBeanCondition.java:147) at org.springframework.boot.autoconfigure.condition.OnBeanCondition.getMatchingBeans(OnBeanCondition.java:119) at org.springframework.boot.autoconfigure.condition.OnBeanCondition.getMatchOutcome(OnBeanCondition.java:83) at org.springframework.boot.autoconfigure.condition.SpringBootCondition.matches(SpringBootCondition.java:45) ... 16 common frames omitted Caused by: java.lang.ClassNotFoundException: org.aopalliance.aop.Advice at java.net.URLClassLoader$1.run(URLClassLoader.java:372) at java.net.URLClassLoader$1.run(URLClassLoader.java:361) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:360) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 36 common frames omitted 2015-03-11 18:36:26.422 INFO 7298 --- [ main] ationConfigEmbeddedWebApplicationContext : Closing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@5427c60c: startup date [Wed Mar 11 18:36:25 IST 2015]; root of context hierarchy 2015-03-11 18:36:26.424 WARN 7298 --- [ main] ationConfigEmbeddedWebApplicationContext : Exception thrown from ApplicationListener handling ContextClosedEvent java.lang.IllegalStateException: ApplicationEventMulticaster not initialized - call 'refresh' before multicasting events via the context: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@5427c60c: startup date [Wed Mar 11 18:36:25 IST 2015]; root of context hierarchy at org.springframework.context.support.AbstractApplicationContext.getApplicationEventMulticaster(AbstractApplicationContext.java:344) at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:331) at org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:869) at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.doClose(EmbeddedWebApplicationContext.java:150) at org.springframework.context.support.AbstractApplicationContext.close(AbstractApplicationContext.java:836) at org.springframework.boot.SpringApplication.run(SpringApplication.java:342) at org.springframework.boot.SpringApplication.run(SpringApplication.java:957) at org.springframework.boot.SpringApplication.run(SpringApplication.java:946) at com.test.Application.main(Application.java:11) 2015-03-11 18:36:26.424 WARN 7298 --- [ main] ationConfigEmbeddedWebApplicationContext : Exception thrown from LifecycleProcessor on context close
Application.java
package com.test; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
Employee.java
package com.test; public class Employee { private final int count; private final String name; public Employee(int count,String name) { this.count = count; this.name = name; } public int getCount() { return count; } public String getName() { return name; } }
EmployeeController.java
package com.test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController public class EmployeeController { @Autowired private EmployeeDao dao; @RequestMapping("/employee") public Employee employee(@RequestParam(value="name") String name) { System.out.println("Count="+dao.getTotalCount()); return new Employee(dao.getTotalCount(),name); } }
EmployeeDao.java
package com.test; public interface EmployeeDao { public int getTotalCount(); }
EmployeeDaoImpl.java
package com.test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Component; @Component public class EmployeeDaoImpl implements EmployeeDao{ @Autowired private JdbcTemplate jdbcTemplate; public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } public int getTotalCount(){ @SuppressWarnings("deprecation") int numOfTrades = jdbcTemplate.queryForInt("select count(*) from employee"); return numOfTrades; } }
application.properties
spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver spring.datasource.url=jdbc:oracle:thin:@testserver.com:2126:QADBA9FU spring.datasource.username=test spring.datasource.password=password123
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.springframework</groupId> <artifactId>gs-rest-service</artifactId> <version>0.1.0</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.2.2.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.oracle</groupId> <artifactId>ojdbc5</artifactId> <version>11.2.0.1.0</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> <repositories> <repository> <id>spring-releases</id> <url>https://repo.spring.io/libs-release</url> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>spring-releases</id> <url>https://repo.spring.io/libs-release</url> </pluginRepository> </pluginRepositories> </project>
-
Steve about 9 yearsAlso, annotate
EmployeeDaoImpl
as a@Repository
to getJdbcTemplate
injected. And deletesbeans.xml
... and whatever is trying to load it. -
Steve about 9 yearsAnd delete the
spring-jdbc
import frompom.xml
. -
Eddú Meléndez about 9 yearsJdbcTemplate must have @Autowired
-
Eddú Meléndez about 9 yearsload application Context from the xml is not needed. I have updated my answer.
-
Sivasakthi Jayaraman about 9 years@EddúMeléndez, thanks for looking into this issue. I modified as per your suggestion but same problem exists, i am always getting this error "Could not evaluate condition on org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration#transactionManager" error. I have updated the suggested code in the original post also. Can you please recheck it?
-
Sivasakthi Jayaraman about 9 years@Steve and Eddu, if anyone of you solve this issue, i will give 50 bounty for the right answer. I am ok with mysql db also.
-
Steve about 9 yearsRemove:
dao= new EmployeeDaoImpl();
from the controller. -
Steve about 9 yearsAlso looks like
spring-boot-starter-jdbc
hasn't been added to thepom.xml
yet. -
Eddú Meléndez about 9 yearsAutowired annotation inject the class instance in the field. For that reason you don't need to instantiate the class.
-
Sivasakthi Jayaraman about 9 yearsi have already "spring-boot-starter-jdbc" in my pom and also i removed dao= new EmployeeDaoImpl(); but the same problem exists.
-
Eddú Meléndez about 9 yearsCan you share your project in github, please?
-
Eddú Meléndez about 9 yearsI have reviewed your configuration and everything is working fine with a embedded database. So, I think that the error is with oracle. Check my EDIT 2 section please.
-
Sivasakthi Jayaraman about 9 yearsInstead of pom, i manually downloaded the ojdbc6 jar and set it in the classpath and its worked. thanks for you help. As i promised i will give you 50 Bounty asap. Bounty for this question is not yet opened, so i will give you once its opened. I really appreciate your help on this.
-
Sivasakthi Jayaraman about 9 yearsI am not able to see bounty button at this moment. I going to unaccept the answer and see the button is enabled, if so i will provide the bounty and accept the answer.
-
Sivasakthi Jayaraman about 9 yearsBounty will be enabled after 12 hours , so please wait.
-
Sivasakthi Jayaraman about 9 yearsi awarded bounty for this answer, it will be credited in 24 hours.
-
Sivasakthi Jayaraman about 9 yearsThanks for your help.