Spring SimpleMappingExceptionResolver не собирается в представление по умолчанию

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

То, что я пробовал, - это посещение определенной страницы в моем приложении и выдача исключения в методе handleRequestInternal.

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

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

Ниже приведена карта, которую я использую.

<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 ответ

Решение

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

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

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

Другие вопросы по тегам