How to autowire spring-data CrudRepository
You don't need to put @Repository
annotation on Test1
. Put these 3 annotation on your CourseAPIStarter
class your application will run like hot knife in butter.
@ComponentScan(basePackages={"com.joydeep.springboot"})
@EntityScan(basePackages={"com.joydeep.springboot.vo"})
@EnableJpaRepositories(basePackages={"com.joydeep.springboot"})
@ComponentScan
will scan your objects, and will register them with Spring.
@EnableJpaRepositories
will enable all your Spring JPA repositories to be used in your application.
@EntityScan
: As you added @Entity
annotation on your model object class, Spring will assume that a table will exists with name Message
. So to register this class with Spring as Entity
you need to use this annotation.
Related videos on Youtube
Joydeep
Updated on September 15, 2022Comments
-
Joydeep over 1 year
A bit of Details I am having some problem while running the code given below. I am getting the following exception. When i am trying the sample code of [CrudRepository for Spring Data][1].
I have an Interface:
package com.joydeep.springboot; import org.springframework.data.repository.CrudRepository; import com.joydeep.springboot.vo.Message; public interface Test1 extends CrudRepository<Message, String> { }
VO Class:
package com.joydeep.springboot.vo; import java.util.Date; import javax.persistence.Entity; import javax.persistence.Id; @Entity public class Message { @Id private String id; private String text; private String author; private Date created; public Message() { super(); } public Message(String id, String text, String author, Date created) { super(); this.id = id; this.text = text; this.author = author; this.created = created; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getText() { return text; } public void setText(String text) { this.text = text; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public Date getCreated() { return created; } public void setCreated(Date created) { this.created = created; } }
Controller class:
package com.joydeep.springboot; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloCntrl { @Autowired Test1 test; @RequestMapping("/hello") public String sayHi(){ return "Hi"; } }
Initializer class:
package com.joydeep.springboot; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class CourseAPIStarter { public static void main(String[] args) { SpringApplication.run(CourseAPIStarter.class); } }
pom.xml:
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>io.springboot</groupId> <artifactId>rest-course-api</artifactId> <version>0.0.1-SNAPSHOT</version> <name>Rest service course API</name> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.4.2.RELEASE</version> </parent> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.apache.derby</groupId> <artifactId>derby</artifactId> <scope>runtime</scope> </dependency> </dependencies> </project>
Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'helloCntrl': Unsatisfied dependency expressed through field 'test'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.joydeep.springboot.Test1' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations {@org.springframework.beans.factory.annotation.Autowired(required=true)}
The example i am referring is from this link.
https://spring.io/guides/gs/accessing-data-jpa/
-
Jens over 7 yearsPlease format your code properbly
-
-
Joydeep over 7 yearsI was looking at the link. The code says that @Repository is not needed .
-
Joydeep over 7 yearsAlso adding the annotation do not help, I am getting the same exception still.
-
amicoderozer over 7 yearsTypically in a normal Spring configuration (with xml or annotations), this error means that the bean is not annotated correctly or that you haven't include in your web.xml the component-scan line. But since you use spring boot the only thing is missing here is Message class. Try post it please. The other classes seem correct to me.
-
andrew0007 over 4 yearsWhy is @SpringBootApplication not enough? Thanks
-
Angshuman over 4 years@andrew0007 When you annotate your application class with
@SpringBootApplication
annotation it internally enables@EnableAutoConfiguration
,@ComponentScan
,@ConfigurationPropertiesScan
etc. Now when@EnableAutoConfiguration
is included Spring ties to guess the application behavior and adds the required configuration by reading the jar dependency you have added and if it founds any datasource is added in the project it will automatically configure these annotations with the default value. That means@SpringBootApplication
alone will work and for these annotations. -
Angshuman over 4 years