簡體   English   中英

在Spring中配置異常處理

[英]Configuring exception handling in spring

我在java webapp中使用extdirectspring和spring。

我最近一直在嘗試基本上按照本教程設置異常處理。

我有一些上下文文件。 但是在將以下設置添加到我的模塊(其中包含異常處理程序)后

一個叫做服務器上下文的樣子是這樣的

<context:component-scan base-package="blah.eventsModule" />

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix">
        <value>/WEB-INF/errorPages/</value>
    </property>
</bean>

<mvc:annotation-driven />

這是我在其中添加異常處理內容的內容

它應該接這個課程:

@Component
public class ErrorReporter
{
    @Autowired
    private MyConfig _config;

    @ExceptionHandler(Throwable.class)
    public ModelAndView ShowErrorPage(Exception exception)
    {
        if (_config.debug())
            return new ModelAndView("ShowStackTrace.jsp", "exception", exception);

        return new ModelAndView("Whoops.jsp");
    }
}

最初,我省略了<mvc:annotation-driven />來查看是否有必要。 沒有找到ShowErrorPage中的斷點,因此我將其放回去。現在,我得到以下錯誤:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'routerController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter ch.ralscha.extdirectspring.controller.RouterController.handlerAdapter; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter] is defined: expected single matching bean but found 2:

這是在extdirectspring(第三方庫)中發生的。

我沒有顯式創建RequestMappingHandlerAdapter但是顯然現在我有兩個。 我不在乎extdirect試圖做什么。 因此,如果有一種方法可以確定我在做什么,那將是很好的。

我能想到的唯一一件事是春天不喜歡有多個

<mvc:annotation-driven />

在項目中聲明。

以下是一些看起來可疑的代碼:

public class LoggingHandlerExceptionResolver implements HandlerExceptionResolver, Ordered
{
    private final static Logger logger = LoggerFactory.getLogger(LoggingHandlerExceptionResolver.class);

    @Autowired
    private ErrorLogService errorLogService;

    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object o, Exception e) {
    ...

    // Returning null allows other HandlerExceptionResolvers to be called (e.g. to show an error page)
    return null;
}

那里的評論不是我的,我也不知道它是否正確,但看起來像是在同一個球場上,並建議將這些事情中的多個都可以。

該課程在我們的“核心”模塊中

就像這個xml片段一樣:

<!-- Spring MVC configuration -->
<mvc:annotation-driven conversion-service="conversionService">

    <mvc:argument-resolvers>
        <!-- Resolve Spring Data pageable arguments -->
        <bean class="org.springframework.data.web.PageableArgumentResolver" />
    </mvc:argument-resolvers>

    <mvc:message-converters>
        <!-- Wire the custom object mapper into Spring MVC -->
        <bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
            <property name="objectMapper" ref="objectMapper" />
        </bean>
    </mvc:message-converters>

</mvc:annotation-driven>

這似乎與我的工作無關,但這是mvc:注釋驅動的項目中唯一出現的其他地方。

任何人都可以對發生的事情有所了解嗎?

我想將兩種單獨的錯誤處理方法分開-我要添加的新方法用於項目的新部分-我們有2種部署-一種已經徹底破壞,並且依賴於抑制錯誤的幾個不同組件。 在新版本中,我們不會在地毯下推開例外。 這是我最近問的另一個問題的跟進,該問題是有關在Webapp中獲取明智的異常處理的

我們有2個單獨的應用程序上下文,而不穩定的應用程序在頂部不包含新文件。 他們都使用核心模塊。

更新資料

如果我將注釋驅動的代碼片段從核心模塊中刪除,那么我將不再遇到自動裝配的問題,但是仍然無法運行新的異常處理。

好像一旦我弄清楚了如何使它工作,那么問題將是如何合並2個mvc配置?

春季問題的典型解決方案:我不了解發生了什么,但是在復制其他內容后,我不了解我現在有一些有效的功能!

我不太確定我何時停止成為程序員,而是成為擺弄配置文件的人。 這是一個逐漸的死亡!

我更改了錯誤處理程序,以遵循其他工作方式的樣式。

我現在將其定義為應用程序上下文中的bean

<bean class="blah.LoggingHandlerExceptionResolver"/>
<bean class="blah.ErrorReporter"/>

它看起來像這樣:

public class ErrorReporter implements HandlerExceptionResolver, Ordered
{
    @Autowired
    private MyConfig _config;

    @Override
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception exception)
    {
        if (_config.debug())
            return new ModelAndView("ShowStackTrace.jsp", "exception", exception);

        return new ModelAndView("Whoops.jsp");
    }

    @Override
    public int getOrder()
    {
        return 0;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM