私はチュートリアルをするためにmavenを使いました https://spring.io/guides/gs/uploading-files/
私が使ったコードはすべてコピーされています。
アプリケーションは実行できますが、エラーが発生します。
ホワイトラベルエラーページこのアプリケーションには/ errorの明示的なマッピングがないため、これはフォールバックと見なされています。 Tue Jun 30 17:24:02 CST 2015予期しないエラーが発生しました(タイプ=見つかりません、ステータス= 404)。メッセージはありません
どうすれば修正できますか?
メインクラスが他のクラスの上のルートパッケージにあることを確認してください。
Spring Boot Application(つまり@SpringBootApplicationのアノテーションが付けられたクラス)を実行すると、Springはメインクラスパッケージの下のクラスのみをスキャンします。
com
+- APP
+- Application.Java <--- your main class should be here, above your controller classes
|
+- model
| +- user.Java
+- controller
+- UserController.Java
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のドキュメントから:
多くのSpring Boot開発者は常に彼らのメインクラスに
@Configuration
、@EnableAutoConfiguration
および@ComponentScan
のアノテーションを付けています。これらのアノテーションは非常に頻繁に一緒に使用されるので(特に上記のベストプラクティスに従う場合)、Spring Bootは便利な@SpringBootApplication
の代替手段を提供します。
@SpringBootApplication
アノテーションは、デフォルトの属性で@Configuration
、@EnableAutoConfiguration
、および@ComponentScan
を使用するのと同じです。
アプリケーションに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 クラスに基づいています。
@Configuration
ファイルで、上記のErrorController
を次のようにインスタンス化できます。
@Autowired
private ErrorAttributes errorAttributes;
@Bean
public AppErrorController appErrorController(){return new AppErrorController(errorAttributes);}
ErrorAttributes を実装することで、デフォルトのErrorAttributes
を上書きすることを選択できます。しかしほとんどの場合、 DefaultErrorAttributes で十分です。
私の場合はパッケージの位置のため、それはコントローラのパッケージがメインクラスのパッケージの上になければならないことを意味します
私のメインクラスのパッケージが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";
}}
コーディングの終了後、プレスブートダッシュボード
コントローラがマッピングされているかコンソールだけではないことを確認する最後のこと
Mapped "{[/hello]}" onto public Java.lang.String co.companyname.spring.tutorial.controllers.HelloController.hello()
ハッピーコーディング
私の場合、コントローラクラスは@Controller
でアノテートされていました。これを@RestController
に変更することで問題は解決しました。基本的に@RestController
は@Controller + @ResponseBody
なので、それぞれのメソッドで@RestController
を使うか、@Controller
アノテーションを付けて@ResponseBody
を使うかのどちらかです。
ここでいくつかの便利なメモ: https://www.genuitec.com/spring-frameworkrestcontroller-vs-controller/
依存関係を追加してみてください。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
これは、明示的なエラーページが定義されていない場合に発生します。エラーページを定義するには、ビューを使用して/ 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";
}
}
メインクラスでは、設定 "@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!";
}
}
P.S:アプリケーションを起動する前に、mvn cleanコマンドとmvn installコマンドを実行してください。
この依存関係を追加したところ、問題が解決しました。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
あなたはエラーを取得している可能性があります。
「このアプリケーションには/ errorの明示的なマッピングがないため、これはフォールバックと見なされています。」
これは、main()クラスで指定しなければならないController&Serviceクラスをスキャンしていないためです。
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);
}
}
注:ここでは、デモ、コントローラ、サービスなどのさまざまなクラスをスキャンするように指定していますが、それが正常に機能するだけです。
私は数週間Spring Bootアプリケーションを開発しています。そして私は以下のような同じエラーを取得しました。
ホワイトラベルエラーページこのアプリケーションには/ errorの明示的なマッピングがないため、これはフォールバックと見なされています。 Thu Jan 18 14:12:11 AST 2018予期しないエラーが発生しました(タイプ=見つかりません、ステータス= 404)。メッセージはありません
このエラーメッセージが表示されたとき、私のコントローラまたは残りのコントローラクラスがプロジェクトで定義されたメモであることに気づきました。 私たちのすべてのコントローラパッケージは@SpringBootApplicationアノテーションを含むメインクラスと同じパッケージではないことを意味します。私はあなたにコントローラパッケージの名前を追加する必要があることを意味しますあなたのメインクラスに@SpringBootApplicationアノテーションが含まれている@ComponentScanアノテーション。あなたがあなたの問題の下のコードを書くのであれば解決されるでしょう...最も重要なことはあなたにあなたのすべてのコントローラのパッケージを追加しなければならないということです私が以下のように@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);
}
}
このコードが誰かに役立つことを願っています...
このエラーを解決する別の方法を見つけた場合、または私に提案がある場合は、コメントに書いてください...ありがとう...
問題は、ガイドの指示に従ってlocalhost:8080/uploadの代わりにlocalhost:8080 /に移動していることです。 Spring Bootにはデフォルトのエラーページがあり、未定義のルートに移動したときにサーバー固有の詳細情報を漏らさないようにします(これはセキュリティ上のリスクと見なすことができます)。
右のページにアクセスする、独自のランディングページを追加する、または ホワイトエラーページを上書きする のいずれかを選択できます。
この特定の状況を単純化するために、私はガイドを更新して/ uploadの代わりに/を使用するようにしました。
依存関係のリストに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
著者: Biju Kunjummen
あなたは、パッケージがpublic static main(または@SpringBootApplicationを書いた場所)を含むパッケージ、他のすべてのパッケージの父親となるようにパッケージを編成する必要があります。
私はそれが質問に対する正確な答えではないことを知っています、しかしこの質問はグーグルに現われる最初のものです:)
Swagger UIにアクセスしようとすると、問題(「このアプリケーションには/ errorの明示的なマッピングがありません」)が表示されます。
私の場合、問題は@RestController( "/ endpoint")によって引き起こされていましたが、これはswaggerでは正しく処理されません。
だから、これはエラーになりました:
@RestController("/endpoint")
public class EndpointController {
そしてこれは大丈夫だった
@RestController
@RequestMapping("/endpoint")
public class EndpointController {
私は同じような間違いをした、私は春のブートと速度を使用して、私の解決策は、このプロパティが間違っていることがわかったファイルapplication.properties、spring.velocity.toolbox-config-locationをチェックすることです
チュートリアルでは、コントローラはモデルオブジェクトのMapを作成してビューを見つけるために使用される@Controllerでアノテーションが付けられますが、@RestControllerは単にオブジェクトを返し、オブジェクトデータはJSONまたはXMLとしてHTTPレスポンスに直接書き込まれます。応答を表示したい場合は、@ RestControllerを使用するか、または@ ResponseBodyを@Controllerと共に使用します。
@Controller
@ResponseBody
私も同じエラーを受け、私の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をコントローラからのビューとして返していました。この答えが同じ問題に苦しんでいる人に役立つことを願っています。
ThymeleafでSpring Bootサンプルアプリケーションを試しているときに私は同じようなエラーを得ていました、残念ながらうまくいかなかった提供されたすべての異なる解決策を試してみました。
私のエラーは、Controllerメソッドから返された文字列がそれぞれのビューのHTMLを持っていないということでした。
あなたが見逃したか、ファイル名に誤字がある可能性があります。コントローラ内部の例に示すように
@GetMapping("/")
public String listUploadedFiles(Model model) throws IOException {
model.addAttribute("files", storageService.loadAll().map(
path -> MvcUriComponentsBuilder.fromMethodName(FileUploadController.class,
"serveFile", path.getFileName().toString()).build().toString())
.collect(Collectors.toList()));
return "uploadForm";
}
返される文字列は、次のHTMLファイル名と一致する必要があります。
src/main/resources/templates/uploadForm.html
Thymeleafは戻り型と同じ名前のファイルを探してビューを表示します。あなたはどんなhtmlファイルでも試みることができて、returnステートメントでファイル名を与えることができます、そしてそれはそれぞれの見解に居住します。
Spring Bootとapplication.propertiesファイルを使用して、私は自分のプロジェクトの構造を変更しなければなりませんでした。 JSPファイルは次の場所にあるはずです。\ src\main\resources\META-INF\resources\WEB-INF\jsp。この変更の後、私のプロジェクトは動作します。私はここで解決策を見つけました: https://www.logicbig.com/tutorials/spring-framework/spring-boot/boot-serve-dynamic.html
自分のView、JSP、またはHTMLをWEB-INFまたはMETA-INFに配置していないことを確認してください。
この詳細を注意深く述べてください。
spring.mvc.view.prefix
spring.mvc.view.suffix
コントローラクラスで@Controllerを@RestControllerに変更すると、すべてがスムーズに進みます。
あなたが@ RestControllerアノテーションでコントローラクラスをマークしたかどうかチェックしてください。
インターフェースにrequestMappingでアノテーションを付けた場合は、そのインターフェースを実装するClassにも@Componentでアノテーションを付けてください。
SpringアプリケーションがSpringコンポーネントを見つけることができず、それがスプリントコンテナで初期化されないときに、以下の例のように@ComponentScanと@SpringBootApplicationを使用してコンポーネントを追加できます。
@SpringBootApplication
@ComponentScan({"model", "service"})
class MovreviewApplication {
public static void main(String[] args) {
SpringApplication.run(MovreviewApplication.class, args);
}
上記の例ではモデルとサービスは私のアプリのパッケージです。
私は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')
以前私は同じエラーを引き起こしている最後のものを見逃していました。
あなたの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);
}
}
私はこの問題に直面していて、その後、基本的にMvcConfig
とViewControllers
のマッピングを行うsetViewNames
クラスに@Configuration
アノテーションが欠けていることに気付きました。
ファイルの内容は次のとおりです。
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");
}
}
これが誰かに役立つことを願っています!
それはあなたがそこにないページにアクセスしようとしていることを意味します。コードに@RequestMapping( "/ home")を使用して "home.jsp"を返す場合は、jspファイルが/webapp/home.jspにあるとします。 localhost:port /を使用してアクセスしようとするとこのエラーになりますが、localhost:port/homeを使用してもエラーにはなりません。アクセスしようとしているページまた、Mavenの依存関係からTomcat jaspherの依存関係を追加してみることもできます。
私の場合、この問題は、最初にMavenで実行した後にIntelliJ内からSpringApplicationを実行すると発生します。
問題を解決するために、私は最初にmvn clean
を実行します。その後、IntelliJ内からSpringApplicationを実行します。
これは、コントローラクラスの上にある@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!";
}
}
Main。クラスがコントローラの上にあるようにしてください。次の例の場合
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();
}
}
メインクラスがルートフォルダにある場合は、次のパスのようになります。{プロジェクト名}/src/main/Java/mainそれからあなたのコントローラーがあなたのメインクラスの下にあることを確認してください。例えば{プロジェクト名}/src/main/Java/main/controllersです。
この種の問題を解決するために私がしたことは、MVC Configクラスで注釈@ 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");
}
}