Spring SimpleMappingExceptionResolver не собирается в представление по умолчанию - PullRequest
3 голосов
/ 03 июня 2010

Я играю с SimpleMappingExceptionResolver, чтобы посмотреть, как он работает, и посмотреть, пригодится ли он нам для клиента, но у меня возникли проблемы с его пониманием.

Я пытался посетить определенную страницу в моем приложении и вызвать ее исключение в методе handleRequestInternal.

Когда я выбрасываю RecoverableDataAccessException (подкласс DataAccessException), тогда корректная страница ошибки отображается, как и ожидалось.

Когда я выбрасываю исключение freemarker.core.InvalidReferenceException или java.lang.NumberFormatException, на страницу выводится исключение, и отображается страница ошибки 500 по умолчанию (т. Е. Без стиля).

Ниже я использую отображение.

<bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    <property name="exceptionMappings">
        <props>
            <prop key="org.springframework.dao.DataAccessException">/general/error/500</prop>
            <prop key="freemarker.core.InvalidReferenceException">/general/error/500</prop>
            <prop key="NumberFormatException">/general/error/500</prop>
        </props>
    </property>
    <property name="defaultErrorView" value="/general/error/500" />
</bean>

Я, по крайней мере, ожидал, что представление ошибок по умолчанию получит исключение и отобразит страницу с моей конкретной ошибкой, но этого не происходит.

Правильно ли я здесь использую SimpleMappingExceptionHandler?

[править] Я использую причал.

[править] Я понял, что SMER не обрабатывает ошибки, возникающие во время рендеринга, что объясняет, почему он не может отследить те, с которыми у меня возникли проблемы. Можно ли заставить SMER справиться с 500 ошибками стиля?

1 Ответ

9 голосов
/ 04 июня 2010

Как вы обнаружили, SimpleMappingExceptionResolver не будет работать для исключений, генерируемых в слое вида. Он реализует интерфейс HandlerExceptionResolver, который, как следует из названия, обрабатывает только исключения, выданные обработчиком (то есть контроллером).

Если вам нужно обработать исключения, выданные представлением, вы можете либо написать HandlerInterceptor, переопределяя метод afterCompletion(), либо написать сервлет не из Spring Filter. В обоих случаях вы не получите преимущества распознавателя Spring, вам придется самостоятельно обрабатывать рендеринг.

Одно предупреждение, хотя - когда вы получаете исключения в слое представления, не всегда возможно обработать их изящно, поскольку сервер, возможно, начал сбрасывать вывод представления клиенту, когда выдается исключение, в котором В этом случае сервер не может отобразить отдельную страницу с ошибкой. Вот почему рекомендуется использовать как можно больше логики на уровне контроллера, чтобы исключения перехватывались как можно раньше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...