2017-03-02 21 views
0

現在、未知のURLをすべてグローバルに処理するコントローラを作成しようとしています。それでは、私がやったことはSpring MVCコントローラのリクエストマッピングで特定のパスを除外する

import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 

@Controller 
@RequestMapping("/**") 
public class UnknownUrlController { 
    @RequestMapping(value = "/", method = RequestMethod.GET) 
    public String getError404() { 
     return "/error404"; 
    } 
} 

次のようなコントローラを作成して私の意図は、単にブラウザに「見つかりません」の文字列が呼び出されなかった返すデフォルトのサーブレットを確保することでした。すべての未知のURLがこのコントローラによって処理されたので、この戦略は機能しました。

@Override 
public void addResourceHandlers(ResourceHandlerRegistry registry) { 
    registry.addResourceHandler("/css/**").addResourceLocations("/css/"); 
    registry.addResourceHandler("/js/**").addResourceLocations("/js/"); 
    registry.addResourceHandler("/img/**").addResourceLocations("/img/"); 
} 

ので、代わりに私の静的ファイルを次のように問題はコントローラはまた、私のすべての静的リソース(画像、JSとCSSファイル)のために呼び出されたことを、私は私のWebMvcConfigurerAdapterで構成されていたましたがブラウザに表示されると、私のエラーページがその場所で提供されました。私は後でコントローラのマッピングがこのanswerの静的リソースよりも優先されることを理解しましたが。これが私のリソースURLマッピングをこのコントローラによって処理されないようにする方法を知りたいので、未知のURLをトラップすることだけに関係します。ようにtrueに私ののDispatcherServletthrowExceptionIfNoHandlerFoundフィールドを設定し、私は(私はおそらく何かが足りないのです)私は仕事を得ることができなかったいくつかの他のものを試していたこの戦略を進める前に

  1. URLマッピング用のハンドラが見つからなかった場合にスローされるべき例外と、hereのようにグローバルに処理する例外。しかし、デフォルトのハンドラは常に不明なパス(/ **)に割り当てられているようで、例外は一度もスローされません。
  2. はapplication.propertiesファイルを作成し、spring.mvc.throw-exception-if-no-handler-found = trueを設定しました。

私の設定はすべてxmlファイルのないJavaベースであり、そのまま使用することをお勧めします。

答えて

1

Springでカスタムエラーハンドラを書くより良い方法があります。以下、この参照してください:

@ExceptionHandler(ResourceNotFoundException.class) 
@ResponseStatus(HttpStatus.NOT_FOUND) 
public String handleResourceNotFoundException() { 
    return "notfound"; 
} 

It as a nice blog entry about exception handlers in Spring MVC.

をDispatcherServletのが404の場合に例外をスローしない場合は、setThrowExceptionIfNoHandlerFoundのDispatcherServletの()メソッドを使用してオンにする必要があります。

Here you can find more information about, how to turn it on

+0

こんにちは。私はそのリンクをも読んでいます。試してみた最初のことを見ると、ここのリンクは実際には同じ記事にリンクしています。この手法を実装していた問題は、URLがコントローラにマップされていない場合、Dispatcherサーブレットが例外をスローしないことです。したがって、処理できる例外はスローされません。 – dawuzi

+0

dispatcherServletでは、404の場合に例外をスローするように設定できます。これを制御するメソッドは次のとおりです。http://docs.spring.io/spring-framework/docs/current/javadoc-api /org/springframework/web/servlet/DispatcherServlet.html#setThrowExceptionIfNoHandlerFound-boolean- – SaWo

+0

こんにちは。私もそれを試みましたが、代わりに例外をスローするのではなく、ブラウザに「Not Found」を返すだけのデフォルトサーブレットに割り当て続けました。 – dawuzi

1

春ブーツは1.4+ HTMLステータスコードに基づいて、宣言エラーページをサポートしています。

http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-error-handling-custom-error-pages

+0

私は質問で言ったようにそれをオンにしようとしました。それが私が試みた2つの事の中で最初に書いたものです。うまく行かなかった。例外はまだ投げられなかった – dawuzi

0

は最後に問題を解決する方法を見つけました。解決策は、Java構成でデフォルトのサーブレット・ハンドラを削除することでした。私のJava設定クラス(WebMvcConfigurerAdapterを拡張1)で、私は

@Override 
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { 
    configurer.enable(); 
} 

Spring MVCのドキュメントのこのsectionで説明したようにこれはの/ ** URLマッピングとDefaultServletHttpRequestHandlerを設定し、次のように以前のデフォルトサーブレットを有効にしていました。これは私の質問で述べた通りDispatcherServletthrowExceptionIfNoHandlerFoundをtrueに設定したにもかかわらず、URLのハンドラが見つからないときに例外がスローされない理由です。

設定をマイクラスから削除した後。グローバル例外ハンドラクラスを作成し、NoHandlerFoundException件のメソッドを追加しました。これは、URLマッピングに対してコントローラハンドラが見つからない場合にスローされる例外です。サンプルコードを以下に示します。これは、spring mvcのドキュメントのsectionでもよく説明されています。

@ControllerAdvice 
public class GlobalExceptionHandler { 

    @ExceptionHandler(NoHandlerFoundException.class) 
    @ResponseStatus(HttpStatus.NOT_FOUND) 
    @RequestMapping(value = {"/*","/**"},method = RequestMethod.GET) 
    public String handle(HttpServletRequest request, NoHandlerFoundException ex) { 
     return "error-404"; 
    } 
} 
関連する問題