programing

여러 컨트롤러를 사용하는 Spring Boot API?

mailnote 2023. 6. 25. 20:24
반응형

여러 컨트롤러를 사용하는 Spring Boot API?

저는 봄부츠를 배우기 시작했습니다.여러 RestController를 사용하는 예제를 찾는 데 어려움을 겪고 있는데, 이는 제가 뭔가 잘못하고 있다는 것을 의미합니다.저는 매우 간단한 예를 시도하고 있습니다.목표는 다음과 같은 전화를 거는 것입니다.

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

localhost:8080/만 표시할 수 있습니다.다른 호출은 응답을 반환합니다.이 응용 프로그램에는 /error에 대한 명시적인 매핑이 없으므로 이를 폴백으로 보는 것입니다.

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

저는 Spring Boot을 시도하고 있는데 같은 문제가 발생하여 수정한 지 얼마 되지 않아 누군가에게 도움이 될 수도 있다고 생각하여 솔루션을 여기에 올립니다.

먼저 컨트롤러 패키지의 루트에 응용 프로그램 클래스(기본 메서드 포함)를 배치합니다.

com.example.demo
              |
              +-> controller
              |      |
              |      +--> IndexController.java
              |      +--> LoginController.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은 데모 패키지의 하위 패키지의 모든 구성 요소를 스캔합니다.

IndexController.java(반환 인덱스.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(로그인.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 주석이 작동합니다.

아래 예를 참조하십시오. 유사하게 적용할 수 있습니다.
패키지 com.dll;

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

사용해 보세요.

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

}

이것이 올바른 방법인지는 모르겠지만, 제가 두 번째 컨트롤러 주석을 @Controller에서 @RestController로 변경했을 때 작동하기 시작했습니다.

아래에서 시도:-

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

}

언급URL : https://stackoverflow.com/questions/37370948/spring-boot-api-with-multiple-controllers

반응형