Mvc approprié: configuration d'intercepteur au printemps
J'ai un peu un problème. J'ai besoin d'appeler sur chaque demande postHandle méthode dans cet intercepteur:
public class DiMenuInterceptor extends HandlerInterceptorAdapter {
@Autowired
private IDiCategoryService categoryService;
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
modelAndView.addObject("category", categoryService.getCategoryInTree());
}
}
donc je l'ai mis dans le servlet de configuration de ces lignes et que tout fonctionne bien.
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" p:interceptors-ref="menuInterceptor" />
<bean id="menuInterceptor" class="cz.cosi.DiMenuInterceptor" />
Mais maintenant je dois changer de configuration et d'utilisation <mvc:interceptors>
Avec cette configuration, j'obtiens une série de null pointer exception sur modelAndView dans le postHandle méthode parce que le postHandle méthode est appelée plus d'une fois par demande.
<mvc:interceptors>
<bean class="cz.cosi.DiMenuInterceptor" />
</mvc:interceptors>
Avec cette configuration, il est au travail, mais uniquement pour les demandes serverAdress/quoi que ce soit. Pour demander serverAdress/quelque chose/quelque chose est postHandle pas appelé.
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/*" />
<bean class="cz.cosi.DiMenuInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
partie de servlet de configuration
<mvc:annotation-driven />
<bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basename" value="classpath:messages" />
<property name="defaultEncoding" value="UTF-8" />
</bean>
<mvc:resources mapping="/css/**" location="/css/" />
<mvc:resources mapping="/images/**" location="/images/" />
<mvc:resources mapping="/js/**" location="/js/" />
<mvc:interceptors>
<bean class="cz.cosi.DiMenuInterceptor" />
</mvc:interceptors>
<tx:jta-transaction-manager />
<tx:annotation-driven />
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
Il semble que le problème pourrait en quelque sorte se rapportent à des ressources, parce que les exceptions ne sont pas correctement chargé images, des styles, et javascript. Sans mvc:les ressources de son travail correctement, mais ce n'est pas une solution.
Ma question est, comment le configurer correctement DiMenuInterceptor avec <mvc:interceptors>
. Merci beaucoup pour les conseils.
pile:
2011-04-14 09:56:02,487 [http-8080-3] DEBUG (FilterChainProxy.java:195) ? Converted URL to lowercase, from: '/images/core/users/super_admin.png'; to: '/images/core/users/super_admin.png'
2011-04-14 09:56:02,533 [http-8080-3] DEBUG (FilterChainProxy.java:202) ? Candidate is: '/images/core/users/super_admin.png'; pattern is /images/**; matched=true
2011-04-14 09:56:02,533 [http-8080-3] DEBUG (FilterChainProxy.java:158) ? /images/core/users/super_admin.png has an empty filter list
14.4.2011 9:56:02 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet spring threw exception
java.lang.NullPointerException
at cz.cosi.DiMenuInterceptor.postHandle(DiMenuInterceptor.java:41)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:801)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:163)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:595)
Peut-être que je trouve une solution, mais ce n'est certainement pas le meilleur. Pour l'instant, il me semble, qui est au travail.
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/*" />
<bean class="cz.cosi.DiMenuInterceptor" />
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/search/**" />
<bean class="cz.cosi.DiMenuInterceptor" />
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/context/**" />
<bean class="cz.cosi.DiMenuInterceptor" />
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/member/**" />
<bean class="cz.cosi.DiMenuInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
source d'informationauteur rinzler
Vous devez vous connecter pour publier un commentaire.
Votre besoin de préciser que votre chemin d'accès inclut des sous-chemins:
/**"
au lieu/*
.@voir Excample au Printemps de Référence, Chapitre 15.12.2 mvc:les intercepteurs
Le problème est que les intercepteurs sont appelés lorsque les ressources sont demandées.
Ce post parle de la façon de prévenir les intercepteurs d'être appelée à l'aide de la configuration xml. Dans la accepté de répondre, je ne suis pas un grand fan de compter sur la sémantique de maquillage des chemins (c'est à dire à l'aide .html ou avoir de la page dans le chemin d'accès). Maintenant, tous les développeurs de l'équipe doivent être conscients de cela lors de la création de contrôleurs.
Moi aussi, je suis pas un fan de la verbose haricot de configuration, j'ai donc décidé d'ajouter le code suivant à l'intercepteur:
J'ai eu très similaire de problème, mais avec l'accès à des polices pour Bootstrap 3. Les intercepteurs bloqué polices ressources comme " glyphicons-les hobbits réguliers.woff' ou 'glyphicons-les hobbits réguliers.ttf", et ils n'étaient pas visibles en première page.
- Je résoudre mon problème de la manière suivante.
La définition de mon intercepteur ressembler à ci-dessous:
Et mon DiMenuInterceptor classe:
J'ai eu la même question. Configuration initiale:
J'ai changé la valeur "mvc:la cartographie", et cela a fonctionné. Ma nouvelle configuration est comme suit: