4

私は以下を持っています

web.xml

<error-page>
    <error-code>500</error-code>
    <location>/WEB-INF/views/errorPages/500.jsp</location>
</error-page>

<error-page>
    <exception-type>java.lang.Exception</exception-type>
    <location>/WEB-INF/views/errorPages/error.jsp</location>
</error-page>

<error-page>
    <exception-type>java.lang.Throwable</exception-type>
    <location>/WEB-INF/views/errorPages/500.jsp</location>
</error-page>

spring-context.xml

<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    <property name="exceptionMappings">
    <props>
        <prop key="java.lang.Exception">error</prop>
    </props>
    </property>
</bean>

<bean id="exceptionResolver"
    class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">

    <property name="exceptionMappings">
        <props>
            <prop key="com.company.server.exception.GenericException">GenericExceptionPage</prop>
            <prop key="java.lang.Exception">error</prop>
        </props>
    </property>

    <property name="defaultErrorView" value="defaulterror"></property>
</bean>

<bean id="viewResolver"
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix">
        <value>/WEB-INF/views/</value>
    </property>
    <property name="suffix">
        <value>.jsp</value>
    </property>
</bean> 

GenericException.java

public class GenericException extends RuntimeException
{
  private static final long serialVersionUID = 1L;

  private String customMsg;
  public String message;

  public String getCustomMsg()
  {
    return customMsg;
  }

  public void setCustomMsg(String customMsg)
  {
    this.customMsg = customMsg;
  }

  public GenericException(String customMsg)
  {
    this.customMsg = customMsg;
  }

  @Override
  public String getMessage()
  {
    return message;
  }

}

myController.java

@Controller
@RequestMapping(value = "/admin/store")
public class AdminController
{


 //bunch of restful drivin requestMappings


}

質問:例外/エラーメッセージを単一のページに表示するために、すべての内部サーバーエラーと例外を取得するにはどうすればよいですか?

4

2 に答える 2

11

@ExceptionHandlerコントローラのメソッドにアノテーションを使用することを検討します。Exceptionこのアノテーションは、バブルがコントローラーを通り過ぎたときにSpringによって呼び出されるメソッドをマークします。

このように、@RequestMappingメソッドの1つがをスローするExceptionと、このメソッドが呼び出され、必要なエラーメッセージを返すことができます。

public class BaseController {
    @ExceptionHandler(Throwable.class)
    public String handleException(Throwable t) {
        return "redirect:/errorPages/500.jsp";
    }

    @ExceptionHandler(Exception.class)
    public String handleException(Throwable t) {
        return "redirect:/errorPages/error.jsp";
    }
}

@Controller
@RequestMapping(value = "/admin/store")
public class AdminController extends BaseController
{
    @RequestMapping(...)
    //Some method

    @RequestMapping(...)
    //Another method
}
于 2012-10-03T17:42:04.507 に答える
3

すべてのコントローラーからの例外を処理する場合は、 SimpleMappingExceptionResolverを拡張するか、AbstractHandlerExceptionResolverを拡張して、ここで説明するようにコンテナーで構成する必要があります。

これにより、あなた(またはコードで作業している他の人)が、例外を処理するために1つの場所とともにすべてのコントローラーをサブクラス化する必要がなくなります。

アノテーションとスーパークラスの使用は機能しますが、アノテーションはコントローラーの使用ごとによりターゲットにされているようです。

さらに、これらの提案は両方とも、コントローラーメソッドからスローされた例外に対してのみ機能します。

.jspファイルからの例外が心配な場合は、この投稿で補足的な解決策を提供する必要があります。

上記のいずれも、スコープが同じではないため、web.xmlエラーページ構成に代わるものではありません。議論のために、この投稿は良い出発点のようです。

于 2012-10-05T02:07:31.300 に答える