Je commence à apprendre Spring Boot. J'ai du mal à trouver un exemple avec plusieurs RestControllers, ce qui m'indique que je fais peut-être quelque chose de mal. J'essaie un exemple très simple: le but est de faire des appels comme suit:
localhost:8080/
localhost:8080/employees/bob
localhost:8080/departments
Je ne peux afficher que localhost: 8080 /. Les autres appels renvoient une réponse: cette application n'a pas de mappage explicite pour/error, vous voyez donc cela comme un repli.
com.demo.departments
Department.Java
DepartmentController.Java
com.demo.employees
Employee.Java
EmployeeController.Java
com.demo
BootDemoApplication.Java
Code:
package com.demo.departments
@RestController
@RequestMapping("/departments")
public class DepartmentController {
@RequestMapping("")
public String get(){
return "test..";
}
@RequestMapping("/list")
public List<Department> getDepartments(){
return null;
}
}
--------------------------------------------------------------------
package com.demo.employees
@RestController
@RequestMapping("/employees")
public class EmployeeController {
Employee e =new Employee();
@RequestMapping(value = "/{name}", method = RequestMethod.GET, produces = "application/json")
public Employee getEmployeeInJSON(@PathVariable String name) {
e.setName(name);
e.setEmail("[email protected]");
return e;
}
}
-----------------------------------------------------------------------
package com.demo
@RestController
@SpringBootApplication
public class BootDemoApplication {
public static void main(String[] args) {
SpringApplication.run(BootDemoApplication.class, args);
}
@RequestMapping("/")
String home(){
return "<html> This is the home page for Boot Demo.</html>";
}
Apparemment, les contrôleurs dans différents packages ne peuvent pas être vus avec la notation @springbootApplication dans la classe principale. La solution expliquée ici, https://kamwo.me/Java-spring-boot-mvc-ontroller-not-called/ .
J'essaie Spring Boot et j'ai le même problème, et je viens de le résoudre, je poste ma solution ici parce que je pense qu'elle peut être utile pour quelqu'un.
Tout d'abord, placez la classe d'application (qui contient la méthode principale) à la racine du package des contrôleurs:
com.example.demo | +-> controller | | | +--> IndexController.Java | +--> LoginController.Java | +-> Application.Java
Application.Java
package com.example.demo;
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);
}
}
Spring analysera tous les composants des sous-packages du package de démonstration
IndexController.Java (retour index.html vue)
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
@RequestMapping(value = {""})
public class IndexController {
@GetMapping(value = {""})
public ModelAndView index() {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("index");
return modelAndView;
}
}
LoginController.Java (retour login.html vue)
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
@RequestMapping(value = {"/login"})
public class LoginController {
@GetMapping(value = {""})
public ModelAndView login() {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("login");
return modelAndView;
}
}
Et maintenant, je peux entrer dans la vue Index: http: // localhost: 8080/demo / et la vue Login: http: // localhost: 8080/demo/login
Pour Spring-boot 1.3.x et versions ultérieures, la transmission d'un package de base à SpringBootApplication devrait fonctionner:
@SpringBootApplication(scanBasePackages = {"com.demo"})
public class DemoBootApplication {
// code
}
Cela a fonctionné pour moi sur une application similaire à l'aide de Spring-boot 1.4.0. Pour les versions antérieures de Spring-Boot, il semble que vous devrez renoncer à utiliser SpringBootApplication et utiliser à la place les éléments suivants pour obtenir le même effet que ci-dessus:
@Configuration
@EnableAutoConfiguration
@ComponentScan(basePackages = {"com.demo"})
public class DemoBootApplication {
// code
}
J'ai trouvé cela dans les commentaires à ce sujet article de blog .
Assurez-vous que la classe @SpringBootApplication se trouve dans un package qui est un niveau supérieur à tous les autres packages contenant @RestControllers, ou dans le même package.
L'annotation ComponentScan fonctionne dans la plupart des cas.
Voir l'exemple ci-dessous, vous pouvez appliquer la même chose.
package com.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@ComponentScan(basePackages = {"com.demo"})
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
Essayez ci-dessous: -
@ComponentScan
@Configuration
@EnableAutoConfiguration
public class BootDemoApplication {
public static void main(String[] args) {
SpringApplication.run(BootDemoApplication.class);
}
}
@RestController
@RequestMapping(value = "test", produces = MediaType.APPLICATION_JSON_VALUE)
public class TestController {
@RequestMapping(method = RequestMethod.GET)
public String test() {
return "from test method";
}
}
Je ne sais pas si c'est la bonne façon de le faire, mais quand j'ai changé mon annotation 2nd Controllers de @Controller à @RestController, cela a commencé à fonctionner.
Essaye ça
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Main {
public static void main(String[] args) {
Object[] sources = new Object[2];
sources[0] = Controller1.class;
sources[1] = Controller2.class;
SpringApplication.run(sources, args);
}
}