このアプリケーションには/ errorの明示的なマッピングがありません


108

Mavenを使用してチュートリアルを実行しましたhttps://spring.io/guides/gs/uploading-files/
使用したすべてのコードがコピーされました。

アプリケーションは実行できますが、エラーが発生します。

ホワイトラベルエラーページこのアプリケーションには/ errorの明示的なマッピングがないため、これはフォールバックと見なされます。6月30日火曜日17:24:02 CST 2015予期しないエラーが発生しました(type = Not Found、status = 404)。メッセージはありません

どうすれば修正できますか?


コメントを投稿に追加しました-自分で編集できます。自分の投稿にコメントするよりも良い
Alexander

回答:


137

メインクラスが他のクラスの上にあるルートパッケージにあることを確認してください。

Springブートアプリケーション(@SpringBootApplicationで注釈されたクラス)を実行すると、Springはメインクラスパッケージの下のクラスのみをスキャンします。

com
   +- APP
         +- Application.java  <--- your main class should be here, above your controller classes
         |
         +- model
         |   +- user.java
         +- controller
             +- UserController.java

4
上または同じレベルですか?
Martin Erlic 2017年

21
私はこれを理解するために私の人生のほぼ2時間を費やしました!
Rakesh 2017

7
それも試しました。まだエラー。少なくともメインページ、つまりlocalhost:8080には、Tomcatホームページが表示されますよね。しかし、それも示されていません
zulkarnain shah 2017

ヒントをありがとう。以前はEclipseユーザーでしたが、この構成は必要ありませんでしたが、今はIntelliJを使用していて、とても期待できました。
アーマーB.

@zulkarnainshah通常のTomcatホームページは、ここに含まれていないWARによって生成されます。
するThorbjörnRavnアンデルセン

61

Springブートアプリケーションを作成するときは、@SpringBootApplication注釈を付けます。この注釈は、アプリケーションが機能するために必要な他の多くの注釈を「まとめ」ます。そのような注釈の1つが@ComponentScan注釈です。このアノテーションは、SpringにSpringコンポーネントを検索し、実行するようにアプリケーションを構成するように指示します。

Springがサブパッケージをスキャンして他の必要なコンポーネントを見つけることができるように、アプリケーションクラスをパッケージ階層の最上位にする必要があります。

package com.test.spring.boot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }
}

コードの下スニペット作品をコントローラパッケージとしての下にあるcom.test.spring.bootパッケージ

package com.test.spring.boot.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HomeController {

    @RequestMapping("/")
    public String home(){
        return "Hello World!";
    }
}

以下のコードスニペット 、コントローラーパッケージがcom.test.spring.bootパッケージの下にないため機能しません

package com.test.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HomeController {

     @RequestMapping("/")
     public String home(){
         return "Hello World!";
     }
 }

Spring Bootのドキュメントから:

多くの春ブーツの開発者は、常にで注釈が付け彼らの主なクラスを持っている@Configuration@EnableAutoConfiguration@ComponentScan。これらの注釈は一緒に頻繁に使用されるため(特に上記のベストプラクティスに従っている場合)、Spring Bootは便利な@SpringBootApplication代替手段を提供します。

@SpringBootApplication注釈は、使用するのと同じです @Configuration@EnableAutoConfigurationそして@ComponentScanそのデフォルト属性を持ちます


3
とてもいい説明。ありがとう
Lova Chittumuri

39

これを解決するにErrorControllerは、アプリケーションにを追加します。エラーコントローラーに必要なビューを返させることができます。

アプリケーションのエラーコントローラーは次のようになります。

import org.springframework.boot.autoconfigure.web.ErrorAttributes;
import org.springframework.boot.autoconfigure.web.ErrorController;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import java.util.Map;

/**
 * Basic Controller which is called for unhandled errors
 */
@Controller
public class AppErrorController implements ErrorController{

    /**
     * Error Attributes in the Application
     */
    private ErrorAttributes errorAttributes;

    private final static String ERROR_PATH = "/error";

    /**
     * Controller for the Error Controller
     * @param errorAttributes
     */
    public AppErrorController(ErrorAttributes errorAttributes) {
        this.errorAttributes = errorAttributes;
    }

    /**
     * Supports the HTML Error View
     * @param request
     * @return
     */
    @RequestMapping(value = ERROR_PATH, produces = "text/html")
    public ModelAndView errorHtml(HttpServletRequest request) {
        return new ModelAndView("/errors/error", getErrorAttributes(request, false));
    }

    /**
     * Supports other formats like JSON, XML
     * @param request
     * @return
     */
    @RequestMapping(value = ERROR_PATH)
    @ResponseBody
    public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {
        Map<String, Object> body = getErrorAttributes(request, getTraceParameter(request));
        HttpStatus status = getStatus(request);
        return new ResponseEntity<Map<String, Object>>(body, status);
    }

    /**
     * Returns the path of the error page.
     *
     * @return the error path
     */
    @Override
    public String getErrorPath() {
        return ERROR_PATH;
    }


    private boolean getTraceParameter(HttpServletRequest request) {
        String parameter = request.getParameter("trace");
        if (parameter == null) {
            return false;
        }
        return !"false".equals(parameter.toLowerCase());
    }

    private Map<String, Object> getErrorAttributes(HttpServletRequest request,
                                                   boolean includeStackTrace) {
        RequestAttributes requestAttributes = new ServletRequestAttributes(request);
        return this.errorAttributes.getErrorAttributes(requestAttributes,
                includeStackTrace);
    }

    private HttpStatus getStatus(HttpServletRequest request) {
        Integer statusCode = (Integer) request
                .getAttribute("javax.servlet.error.status_code");
        if (statusCode != null) {
            try {
                return HttpStatus.valueOf(statusCode);
            }
            catch (Exception ex) {
            }
        }
        return HttpStatus.INTERNAL_SERVER_ERROR;
    }
}

上記のクラスは、Springs BasicErrorControllerクラスに基づいています。

上記のErrorControllerように@Configurationファイルにインスタンス化できます。

 @Autowired
 private ErrorAttributes errorAttributes;

 @Bean
 public AppErrorController appErrorController(){return new AppErrorController(errorAttributes);}

ErrorAttributesErrorAttributesを実装することで、デフォルトのオーバーライドを選択できます。ただし、ほとんどの場合、DefaultErrorAttributesで十分です。


1
BasicErrorControllerクラス404 へのリンク。
ステファン

@owaism:のリンクBasicErrorControllerはもう良くありません。更新できますか?
HDJEMAI

1
へのリンクBasicErrorControllerが修正されました。
axiopisty

15

私の場合、コントローラクラスにはと注釈が付けられてい@Controllerます。それを変更して@RestController問題を解決しました。基本的に@RestControllerある@Controller + @ResponseBody いずれかの使用ので@RestController、または@Controller@ResponseBody各メソッドと注釈。

ここにいくつかの便利なメモ:https : //www.genuitec.com/spring-frameworkrestcontroller-vs-controller/


それは機能しますが、例のように、インターネット全体の基本的な構成は@Controllerで機能するはずです。RestControllerだけが機能するこの理由を知っている組織はありますか?
超新星

クラスに注釈を付けると@RestController、暗黙的に@ResponseBody注釈が追加されますが、@Controller注釈を使用している場合は、この注釈を自分で明示的に追加する必要があります。
Robin Keskisarkka、

10

私の場合、それはパッケージの位置のためです。つまり、コントローラのパッケージはメインクラスパッケージの上にある必要があります

私のメインクラスパッケージがpackage co.companyname.spring.tutorial;いずれかのコントローラパッケージである場合package co.companyname.spring.tutorial.WHAT_EVER_HERE;

package co.companyname.spring.tutorial; // package for main class
@SpringBootApplication
public class FirstProjectApplication {

    public static void main(String[] args) {
        SpringApplication.run(FirstProjectApplication.class, args);
    }
}


package co.companyname.spring.tutorial.controllers; // package for controllers 

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController 
public class HelloController { 

@RequestMapping("/hello")  
public String hello() {   
 return "Hello, world"; 
 }}

プレスブートダッシュボードのコーディング後

ここに画像の説明を入力してください

コントローラーがマッピングされているか、コンソールだけではないことを確認するための最後の1つは、どこか不思議なことに気づくはずです。

Mapped "{[/hello]}" onto public java.lang.String co.companyname.spring.tutorial.controllers.HelloController.hello()

幸せなコーディング


9

これは、明示的なエラーページが定義されていない場合に発生します。エラーページを定義するには、ビューで/ errorのマッピングを作成します。たとえば、以下のコードは、エラーが発生した場合に返される文字列値にマップされます。

package com.rumango.controller;

import org.springframework.boot.web.servlet.error.ErrorController;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class IndexController implements ErrorController{
    private final static String PATH = "/error";
    @Override
    @RequestMapping(PATH)
    @ResponseBody
    public String getErrorPath() {
        // TODO Auto-generated method stub
        return "No Mapping Found";
    }

}

コードに説明を追加できますか?重要な部分である質問をなぜ解決するのですか?
Nico Haase

この回答では、Spring Bootと比較して、最初に少し頭痛の種となった特定の注意事項があります。springframeworkのErrorControllerインターフェイスを実装することが重要です。これを行わずに「/ error」にマップされたコントローラーエンドポイントを作成すると、メソッドがすでにマップされていることを示すエラーが発生します。
mmaynar1 2018

8

依存関係を追加してみてください。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

2
これは実際に何をしますか?
ステルスラビ

私はこの依存関係を追加しましたが、うまくいきました。@StealthRabbiと同じように...私はそれが実際に何をしているのかも疑問に思っています。
twindham 2017

@StealthRabbiこれは、Thymeleafと呼ばれるテンプレートフレームワークに依存関係を追加します。これは、JSPに対する代替の推奨アプローチです。この答えは本当の答えではありません。依存関係を投げることは、中心的な問題に本当に興味がある人を助けません
Christian

5

この依存関係を追加すると、問題が解決しました。

<dependency>
    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

これが私の理論です。「@ Controller」を使用している場合、どういうわけかSpringでは特定のテンプレートエンジンが必要になります。そしてこの場合、Thymeleaf。したがって、spring-boot-starter-thymeleafが必要です。一方、「@ RestController」を使用している場合、Spring Bootはテンプレートエンジンを必要としません。したがって、Thymeleafがなくても機能します。
Yosi Pramajaya

4

私は数週間、Spring Bootアプリケーションを開発しています。以下のような同じエラーが発生しました。

ホワイトラベルエラーページこのアプリケーションには/ errorの明示的なマッピングがないため、これはフォールバックと見なされます。Thu Jan 18 14:12:11 AST 2018予期しないエラーが発生しました(type = Not Found、status = 404)。メッセージはありません

このエラーメッセージが表示されたとき、コントローラーまたは残りのコントローラークラスがプロジェクトで定義されたメモであることに気付きました。つまり、すべてのコントローラーパッケージが@SpringBootApplicationアノテーションを含むメインクラスと同じパッケージではないということです。つまり、@ ComponentScanアノテーションに@SpringBootApplicationアノテーションを含むコントローラーパッケージの名前をメインクラスに追加する必要があります。コードを記述する場合以下の問題が解決します... 最も重要なことは、すべてのコントローラーのパッケージを@ComponentScanアノテーションに追加する必要があることです。

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@ComponentScan({ "com.controller.package1, com.controller.package2, com.controller.package3, com.controller.packageN", "controller", "service" } // If our Controller class or Service class is not in the same packages we have //to add packages's name like this...directory(package) with main class
public class MainApp {
    public static void main(String[] args) {
        SpringApplication.run(MainApp.class, args);
    }
}

このコードが誰かを助けることを願っています...

このエラーを解決する別の方法を見つけた場合、または私に提案がある場合は、コメントに書き込んでください...ありがとう...


4

メインクラスで、構成 "@SpringBootApplication"の後に、引数なしで "@ComponentScan"を追加すると、うまくいきました!!!

メインクラス:

@SpringBootApplication
@ComponentScan
public class CommentStoreApplication {

    public static void main(String[] args) {
        SpringApplication.run(CommentStoreApplication.class, args);

    }
}

RestControllerクラス:

@RestController
public class CommentStoreApp {

    @RequestMapping("/") 
    public String hello() {
        return "Hello World!";
    }
}

PS:アプリケーションを起動する前に、mvn cleanコマンドとmvn installコマンドを実行してください。


4

パーティーにはかなり遅れました。Springの公式ドキュメントによると、「Spring Bootは、サーバーエラーが発生した場合にブラウザークライアントに表示されるホワイトラベルエラーページをインストールします。」 https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-customize-the-whitelabel-error-page

  1. あなたは、設定することで、機能を無効にすることができますserver.error.whitelabel.enabled=falseapplication.ymlapplication.propertiesファイル。

2. 推奨される方法は、エンドユーザーが理解できるようにエラーページを設定することです。resources / templatesフォルダーの下にerror.htmlファイルを作成し、pom.xmlファイルに依存関係を追加します

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

Springは自動的にerror.htmlページをデフォルトのエラーテンプレートとして選択します。注:-依存関係を追加した後、mavenプロジェクトを更新することを忘れないでください。


3

エラーが発生する可能性があります

「このアプリケーションには/ errorの明示的なマッピングがないため、これはフォールバックと見なされます。」

これは、このようにmain()クラスで指定する必要のあるコントローラーおよびサービスクラスをスキャンしていないためです。

package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableAutoConfiguration
**@ComponentScan({"com.example.demo", "controller", "service"})**
public class SpringBootMvcExample1Application {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootMvcExample1Application.class, args);
    }
}

注:ここでは、スキャンするデモ、コントローラー、サービスなどのさまざまなクラスを指定したので、それだけが正しく機能します。


3

他のすべてのパッケージの父親であるpublic static main(または@SpringBootApplicationを記述した場所)を含むパッケージになるように、パッケージを編成する必要があります。


-com.mypackage + nameApplication.java-com.mypachage.model-com.mypachage.controller-com.mypachage.dao
sakgeek

3

デフォルトでは、Spring Bootは現在のパッケージをスキャンしてBean定義を探します。したがって、メインクラスが定義されている現在のパッケージとコントローラーパッケージが同じでない場合、またはコントローラーパッケージがメインアプリパッケージの子パッケージでない場合、コントローラーはスキャンされません。この問題を解決するには、メインパッケージにBean定義のパッケージのリストを含めることができます

@SpringBootApplication(scanBasePackages = {"com.module.restapi1.controller"})

または、子パッケージがメインパッケージから派生したパッケージの階層を作成する

package com.module.restapi;
package com.module.restapi.controller

2

問題は、ガイドで規定されているlocalhost:8080 / uploadではなく、localhost:8080 /に移動していることです。Spring Bootには、未定義のルートに移動するときに使用されるデフォルトのエラーページがあり、サーバー固有の詳細(セキュリティリスクと見なすことができる)が提供されるのを回避できます。

オプションは、正しいページにアクセスするか、独自のランディングページを追加するか、白いエラーページを上書きするかのいずれかです。

この特定の状況を簡略化するために、/ uploadの代わりに/を使用するようにガイドを更新しました。


2

私はそれが質問に対する正確な答えではないことを知っていますが、この質問は最初にGoogleに表示されます:)

Swagger UIにアクセスしようとすると、問題(「このアプリケーションには/ errorの明示的なマッピングがありません」)が表示されます。

私の場合、問題は@RestController( "/ endpoint")が原因で発生しましたが、swaggerでは適切に処理されません。

したがって、これはエラーを引き起こしました:

@RestController("/endpoint")
public class EndpointController {

そして、これは大丈夫でした

@RestController
@RequestMapping("/endpoint")
public class EndpointController {

2

これは、コントローラークラスの上にある@RestControllerアノテーションを忘れた場合に発生する可能性があります。import import org.springframework.web.bind.annotation.RestController;

以下のように注釈を追加します

以下の簡単な例を参照してください

import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;


@RestController
public class HelloController {
@RequestMapping("/")
    public String index() {
        return "Greetings from Spring Boot!";
    }

}

1

コントローラクラスで@Controllerを@RestControllerに変更すると、すべてがスムーズに進みます。


1

私も同じエラーを受け取り、pom.xmlに以下の依存関係を追加することでエラーを解決できました。

<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
    <scope>provided</scope>
</dependency>

理由は、ビューとしてJSPを使用しているためです。Spring Boot Starter Webのデフォルトの埋め込みサーブレットコンテナはtomcatです。JSPのサポートを有効にするには、tomcat-embed-jasperへの依存関係を追加する必要があります。

私の場合、コントローラーからのビューとしてJSPを返していました。この答えが同じ問題で苦労している人を助けることを願っています。


1

私はgradleを使用して同じ問題に直面していましたが、次の依存関係を追加すると解決しました-

compile('org.springframework.boot:spring-boot-starter-data-jpa')
compile('org.springframework.boot:spring-boot-starter-web')
testCompile('org.springframework.boot:spring-boot-starter-test')
compile('org.apache.tomcat.embed:tomcat-embed-jasper')

以前、私は同じエラーを引き起こす最後のものを逃していました。


同じ問題があり、pom.xmlにtomcat-embed-jasperプラグインがありませんでした。そして、tomcat-embed-jasperはjspをレンダリングするために重要です。
リニルナス

boraji.com/…、これはtomcat-embed-jasperが欠落していたことを発見する
rinilnath

1

私はこの問題に直面していましたが、後で基本的におよびのマッピングを行うクラスの@Configuration注釈が欠落していることに気付きました。MvcConfigViewControllerssetViewNames

ファイルの内容は次のとおりです。

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
**@Configuration**
public class MvcConfig implements WebMvcConfigurer{
   public void addViewControllers(ViewControllerRegistry registry)
   {
      registry.addViewController("/").setViewName("login");
      registry.addViewController("/login").setViewName("login");
      registry.addViewController("/dashboard").setViewName("dashboard");
   }
}

これが誰かに役立つことを願っています!!


これでうまくいきました。
Anthony Okoth

1

依存関係のリストにjasperとjstlがあることを確認します。

<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
</dependency>

ここに作業スタータープロジェクトがあります-https://github.com/spring-projects/spring-boot/tree/master/spring-boot-samples/spring-boot-sample-web-jsp

作者:美寿くんじゅうめん


1

私はこのように述べ、パッケージへの参照を与える必要があり、うまくいきました。@EnableAutoConfigurationこの注釈を除外してもかまいませんが、私がDB関連の依存関係をバイパスするために必要です。

@SpringBootApplication
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
@ComponentScan(basePackages = {"your package 1", "your package2"})

public class CommentStoreApplication {

    public static void main(String[] args) {
        SpringApplication.run(CommentStoreApplication.class, args);

    }
}


0

この種の問題を解決するために私が行ったのは、MVCConfigクラスのアノテーション@Configurationに言及することだけです。

このように :

package com.example;

/**
 * Created by sartika.s.hasibuan on 1/10/2017.
 */
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@EnableAutoConfiguration
@Configuration
@ComponentScan
public class MvcConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/home").setViewName("home");
        registry.addViewController("/").setViewName("home");
        registry.addViewController("/hello").setViewName("hello");
        registry.addViewController("/login").setViewName("login");
    }

}

0

私は同様の間違いがありました、私は春のブーツと速度を使用しています、私の解決策はファイルapplication.propertiesを確認することです、spring.velocity.toolbox-config-locationはこのプロパティが間違っていることを発見しました


0

私の場合、この問題は、Mavenで最初に実行した後、IntelliJ内からSpringApplicationを実行すると発生します。

この問題を解決するために、最初に実行しmvn cleanます。次に、IntelliJ内からSpringApplicationを実行します。


0

あなたのメインを確認してください。クラスはコントローラの上に置く必要があります。次の例の場合:

以下を含むMain.class:

@SpringBootApplication
public class Main {
    public static void main(String[] args) {
        SpringApplication.run(Main.class, args);
    }
}

EmployeeController。を含むクラス

@RestController
public class EmployeeController {
    @InitBinder
    public void setAllowedFields(WebDataBinder dataBinder) {
        dataBinder.setDisallowedFields("id");
    }

    @RequestMapping(value = "/employee/save", method = RequestMethod.GET)
    public String save(){
        Employee newEmp = new Employee();
        newEmp.setAge(25);
        newEmp.setFirstName("Pikachu");
        newEmp.setId(100);
        return "Name: " + newEmp.getFirstName() + ", Age: " + newEmp.getAge() + ", Id = " + newEmp.getId();
    }
}

次のパスのように、メインクラスがルートフォルダにある場合:{projectname} / src / main / java / main次に、コントローラがメインクラスの下にあることを確認します。たとえば、{projectname} / src / main / java / main / controllersです。


0

あなたのJavaファイル(例えば:Viper.java)にメインクラスを追加:「@RestController」@RequestMapping( "/")

@SpringBootApplication
@RestController
public class Viper {

  @RequestMapping("/")

   public String home(){
          return "This is what i was looking for";                      
     }

public static void main( String[] args){

   SpringApplication.run(Viper.class , args);
}

}

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.