Spring Boot API с несколькими контроллерами?

Я начинаю изучать Spring Boot. Я изо всех сил пытаюсь найти пример с несколькими RestControllers, который указывает мне, что я могу делать что-то неправильно. Я пытаюсь очень простой пример: цель состоит в том, чтобы сделать следующие звонки:

localhost:8080/
localhost:8080/employees/bob
localhost:8080/departments

Я могу получить только localhost: 8080 / для отображения. Другие вызовы возвращают ответ: Это приложение не имеет явного сопоставления для / ошибки, поэтому вы видите это как запасной вариант.

com.demo.departments
Department.java
DepartmentController.java

com.demo.employees
Employee.java
EmployeeController.java

com.demo
BootDemoApplication.java

код:

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("employee1@genuitec.com");

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

7 ответов


Я пытаюсь Spring Boot и получил ту же проблему, и просто исправил ее, я размещаю свое решение здесь, потому что я думаю, что это может быть полезно для кого-то.

во-первых, поместите класс приложения (который содержит основной метод) в корень пакета контроллеров:

com.example.demo
              |
              +-> controller
              |      |
              |      +--> IndexController.java
              |      +--> LoginController.java
              |
              +-> Application.java

приложение.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 будет сканировать все компоненты субпакетов демо пакета

IndexController.Ява (возврат .HTML-код вид)

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 (return логин.HTML-код вид)

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

и теперь я могу войти Просмотр индекса:http://localhost:8080/demo/ и Вид входа:http://localhost:8080/demo/login


по-видимому, контроллеры в разных пакетах не могут быть замечены с нотацией @springbootApplication в основном классе. Решение, объясненное здесь,https://kamwo.me/java-spring-boot-mvc-ontroller-not-called/.


для Spring-boot 1.3.x и выше, передача базового пакета SpringBootApplication должна работать:

@SpringBootApplication(scanBasePackages = {"com.demo"})
public class DemoBootApplication {
    // code
}

это сработало для меня в аналогичном приложении с использованием spring-boot 1.4.0. Для более ранних версий spring-boot, похоже, вам придется отказаться от использования SpringBootApplication и вместо этого использовать следующее, Чтобы получить тот же эффект, что и выше:

@Configuration
@EnableAutoConfiguration
@ComponentScan(basePackages = {"com.demo"})
public class DemoBootApplication {
    // code
}

Я нашел это в комментариях к этой блоге.


убедитесь, что класс @SpringBootApplication находится в пакете, который является уровнем выше всех других пакетов, содержащих @RestControllers, или в том же пакете.


попробуйте ниже:-

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

}

попробуй такое

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

}

аннотация ComponentScan работает в большинстве случаев.

см. ниже пример, вы можете применить подобное.
пакет 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);
}
}