web-dev-qa-db-fra.com

API Spring Boot avec plusieurs contrôleurs?

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>";
}
10
user1529412

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/ .

6
user1529412

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

13
VietDD

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 .

3
Ian Riley

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.

2
Janac Meena

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);
}
}
1
Red Boy

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

}
0
Apollo

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.

0
jovanchohan

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

}
0
Patricio Nicola