2017-03-20 23 views
18

Więc Uczę się wiosną w par tygodnia, śledził ten tutorial"Pole wymagało fasoli typu, której nie można znaleźć". Błąd wiosna spokojny API użyciu MongoDB

Building a RESTful Web Service

Wszystko było dobrze, dopóki nie próbował zintegrować go do MongoDB. Więc postępuję zgodnie z tym samouczkiem.

Accessing Data with MongoDB

Ale moja praktyka jest częściowo nadal używa się pierwszy. Tak więc moja struktura katalogów projektu jest taka.

src/ 
├── main/ 
│ └── java/ 
|  ├── model/ 
|  | └── User.java 
|  ├── rest/ 
|  | ├── Application.java 
|  | ├── IndexController.java 
|  | └── UsersController.java 
|  └── service/ 
|   └── UserService.java 
└── resources/ 
    └── application.properties 

To mój modelu/User.java plik

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; 
    } 
} 

To mój reszta/UsersController.java plik

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(); 
    } 
} 

To mój usługa/UserService .java plik

Mogłem je skompilować (używam gradle do kompilacji, ponieważ śledzę samouczek), ale kiedy uruchamiam plik jar, to zgłaszałem ten błąd.


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.

Nie wiem co jest nie tak zacznę googling wokół i okazało się, że muszę to Beans.xml plik i zarejestrować userService w nim. Zrobiłem to, ale to nie działa. Jestem na to nowy, więc naprawdę nie mam pojęcia, co się dzieje.

+0

ten sam problem tutaj, rozwiązany? – GuoJing

+0

Rozwiązany, to będzie odpowiedź :) @GuoJing –

Odpowiedz

31

Rozwiązał problem. Domyślnie wszystkie pakiety objęte deklaracją @SpringBootApplication zostaną przeskanowane.

Zakładając mój główny klasa ExampleApplication że ma @SpringBootApplication oświadczenie jest zadeklarowana wewnątrz com.example.something, to wszystkie elementy, które podlega com.example.something jest skanowany podczas com.example.applicant nie będą skanowane.

Są dwa sposoby na zrobienie tego na podstawie tego question. W takim przypadku aplikacja zeskanuje wszystkie określone składniki, ale co się stanie, jeśli skala będzie coraz większa?

Używam więc drugiego podejścia, poprzez restrukturyzację moich pakietów i zadziałało! Teraz moja struktura pakietów stała się taka.

src/ 
├── main/ 
│ └── java/ 
|  ├── com.example/ 
|  | └── Application.java 
|  ├── com.example.model/ 
|  | └── User.java 
|  ├── com.example.controller/ 
|  | ├── IndexController.java 
|  | └── UsersController.java 
|  └── com.example.service/ 
|   └── UserService.java 
└── resources/ 
    └── application.properties 
+0

czy możesz pokazać mi kod? Zrobiłem to w ten sam sposób, ale wciąż wyjątek. :( – GuoJing

+0

nic się właściwie nie zmieniło, po prostu zmieniłem nazwę pakietów i klas @GuoJing –

+0

dzięki.) Wypróbuję to. – GuoJing

16

Dodaj @Service w usłudze/UserService.java.

0

Spędzono dużo czasu z powodu automatycznego importu. Intellij Idea sprowadził się nieco, @Service z import org.jvnet.hk2.annotations.Service; zamiast import org.springframework.stereotype.Service;!

+0

Czy możesz zaktualizować swoją odpowiedź i wyjaśnić, co robisz.Dziękuję z góry – MZaragoza

+0

Co nie rozumiesz z mojej odpowiedzi? Mam ten sam błąd, jak w pytanie, próbując uruchomić projekt, ponieważ zaimportowałem 'Service' z niewłaściwej biblioteki. –

1

miałem również ten sam błąd:

*************************** 
APPLICATION FAILED TO START 
*************************** 

Description: 

Field repository in com.kalsym.next.gen.campaign.controller.CampaignController required a bean of type 'com.kalsym.next.gen.campaign.data.CustomerRepository' that could not be found. 


Action: 

Consider defining a bean of type 'com.kalsym.next.gen.campaign.data.CustomerRepository' in your configuration.de here 

A moje pakiety zostały zbudowane w taki sam sposób, jak wspomniano w przyjętym odpowiedź. Poprawiłem swój problem, dodając adnotację EnableMongoRepositories w głównej klasie, tak:

@SpringBootApplication 
@EnableMongoRepositories(basePackageClasses = CustomerRepository.class) 
public class CampaignAPI { 

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