So I've been learning Spring in the couples of week, been following this tutorial
Building a RESTful Web Service
All was well until I tried to integrate it to mongodb. So I follow this tutorial.
But my practice is partially still using the first one. So my project directory structure is like this.
src/
├── main/
│ └── java/
| ├── model/
| | └── User.java
| ├── rest/
| | ├── Application.java
| | ├── IndexController.java
| | └── UsersController.java
| └── service/
| └── UserService.java
└── resources/
└── application.properties
This is my model/User.java file
package main.java.model;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
@Document(collection="user")
public class User {
private int age;
private String country;
@Id
private String id;
private String name;
public User() {
super();
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
}
This is my rest/UsersController.java file
package main.java.rest;
import java.util.List;
import main.java.service.UserService;
import main.java.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping(value = "/users")
public class UsersController {
@Autowired
UserService userService;
@RequestMapping(method = RequestMethod.GET)
public List<User> getAllUsers() {
return userService.findAll();
}
}
This is my service/UserService.java file
package main.java.service;
import java.util.List;
import main.java.model.User;
import org.springframework.data.mongodb.repository.MongoRepository;
public interface UserService extends MongoRepository<User, String> {
public List<User> findAll();
}
I could compile them (I'm using gradle for compilation because I'm following the tutorial), but when I run the jar file it was throwing this error.
APPLICATION FAILED TO START
Description:
Field userService in main.java.rest.UsersController required a bean of type 'main.java.service.UserService' that could not be found.
Action:
Consider defining a bean of type 'main.java.service.UserService' in your configuration.
Not sure what is wrong I start googling around and found that I need to include Beans.xml
file and register the userService in it. I did that but it's not working. I'm really new to this so I really have no clue on what's going on.
In my case i have just put the Class MyprojectApplication in a package(com.example.start) with the same level of model, controller,service packages.
Add the @Component in your controller class. May this work
I have same Issue, fixed by Adding @EnableMongoRepositories("in.topthree.util")
And My Repository
Now Its Working
In my case, I accidentally defined the service class
abstract
while doing copy and paste.Add the
@Service
in the service/UserService.java.This may happen when two beans have same names.
Module1Beans.java
:Module2Beans.java
:A bean named
retrofitService
is first created, and it's type isGoogleAPI
, then covered by aGithubAPI
becauce they're both created by aretrofitService()
method. Now when you@Autowired
aGoogleAPI
you'll get a message likeField googleAPI in com.example.GoogleService required a bean of type 'com.example.rest.GoogleAPI' that could not be found.