web-dev-qa-db-ja.com

複数のコントローラーを備えたSpring Boot API?

私はSpring Bootを学び始めています。複数のRestControllersを使用した例を見つけるのに苦労しています。これは、何か間違っている可能性があることを示しています。私は非常に簡単な例を試しています:目標は次のような呼び出しを行うことです:

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("[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

明らかに、異なるパッケージのコントローラーは、メインクラスの@springbootApplication表記では表示できません。ソリューションはここで説明されています https://kamwo.me/Java-spring-boot-mvc-ontroller-not-called/

6
user1529412

私はSpring Bootを試していますが、同じ問題があり、それを修正しました。誰かに役立つかもしれないと思うので、ここに自分のソリューションを投稿します。

まず、コントローラーのパッケージのルートにアプリケーションクラス(メインメソッドを含む)を配置します。

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は、demoパッケージのサブパッケージのすべてのコンポーネントをスキャンします

IndexController.Java(returnindex.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(returnlogin.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

13
VietDD

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
}

これについてのコメントで見つけました ブログ投稿

3
Ian Riley

@SpringBootApplicationクラスが、@ RestControllersを含む他のすべてのパッケージより上のレベルのパッケージ、または同じパッケージにあることを確認してください。

2
Janac Meena

ほとんどの場合、ComponentScanアノテーションが機能します。

以下の例を参照してください、あなたは同様に適用できます。
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

以下を試してください:-

@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

これが正しい方法かどうかはわかりませんが、2つ目のControllersアノテーションを@Controllerから@RestControllerに変更すると、機能し始めました。

0
jovanchohan

これを試して

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