2010-07-22 16 views
7

Bu yüzden, web uygulamamı XML olmadan yapılandırmaya ve tüm açıklamalı rotaya geçmeye çalışıyorum. Otomatik olarak alınan @Configuration ve @Component ile açıklanmış birkaç sınıfım var, ancak bir nedenle @Controller ek açıklamaları tanınmayan ve karşılık gelen @RequestMapping değerleriyle eşlenmiyor.Yay 3 Açıklama Yapılandırma Açıklama @Configuration ve @Component yukarı değil, @Controller

Benim web.xml öylesine benziyor:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app id="com-timbuk2-webapp-compositor" 
     version="3.0" 
     xmlns="http://java.sun.com/xml/ns/javaee" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" > 

    <display-name>timbuk2-webapp-Compositor</display-name> 

    <!-- Context Parameters --> 
    <context-param> 
     <param-name>log4jConfigLocation</param-name> 
     <param-value>/WEB-INF/conf/log4j-config.xml</param-value> 
    </context-param> 

    <context-param> 
     <param-name>contextClass</param-name> 
     <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value> 
    </context-param> 

    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>com.company.webapp</param-value> 
    </context-param> 

    <!-- Listeners --> 
    <listener> 
     <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> 
    </listener> 

    <listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 

    <!-- Filters --> 
    <filter> 
     <filter-name>characterEncodingFilter</filter-name> 
     <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 
     <init-param> 
      <param-name>encoding</param-name> 
      <param-value>UTF-8</param-value> 
     </init-param> 
     <init-param> 
      <param-name>forceEncoding</param-name> 
      <param-value>true</param-value> 
     </init-param> 
    </filter> 

    <filter> 
     <filter-name>urlRewriteFilter</filter-name> 
     <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class> 
     <init-param> 
      <param-name>logLevel</param-name> 
      <param-value>commons</param-value> 
     </init-param> 
     <init-param> 
      <param-name>confPath</param-name> 
      <param-value>/WEB-INF/conf/urlrewrite-config.xml</param-value> 
     </init-param> 
    </filter> 

    <!-- Filter Mappings --> 
    <filter-mapping> 
     <filter-name>characterEncodingFilter</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 

    <filter-mapping> 
     <filter-name>urlRewriteFilter</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 

    <!-- Servlets --> 
    <servlet> 
     <servlet-name>dispatcher</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    </servlet> 

    <!-- Servlet mappings --> 
    <servlet-mapping> 
     <servlet-name>dispatcher</servlet-name> 
     <url-pattern>/app/*</url-pattern> 
    </servlet-mapping> 


</web-app> 

Benim asıl @Configuration sınıf öylesine benziyor:

package com.company.webapp.config; 

import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.context.support.ReloadableResourceBundleMessageSource; 
import org.springframework.web.servlet.view.InternalResourceViewResolver; 
import org.springframework.web.servlet.view.JstlView; 

@Configuration 
public class ApplicationConfiguration 
{  
    @Bean 
    public ReloadableResourceBundleMessageSource messageSource() 
    { 
     ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource(); 
     messageSource.setBasename("/WEB-INF/resources/messages"); 
     messageSource.setCacheSeconds(0); 
     return messageSource; 
    } 

    @Bean 
    public InternalResourceViewResolver viewResolver() 
    { 
     InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); 
     viewResolver.setViewClass(JstlView.class); 
     viewResolver.setPrefix("/WEB-INF/views/"); 
     viewResolver.setSuffix(".jsp"); 
     return viewResolver; 
    } 
} 

Benim @Controller ve @Component sınıfları aynı paketi altında yaşıyor.

package com.company.webapp.controller; 

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.springframework.stereotype.Controller; 
import org.springframework.validation.BindingResult; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 
import org.springframework.web.servlet.ModelAndView; 

@Controller 
@RequestMapping(value = "/render") 
public class RenderController 
{ 
    private final Logger logger = LoggerFactory.getLogger(getClass()); 

    @RequestMapping(method = RequestMethod.GET) 
    public ModelAndView handleGet(BindingResult bindingResult) 
    { 
     ... eventually return a ModelAndView object... 
    } 
} 

Yani yinelemek benim @Controller sınıfları ben belirterek ediyorum URL'lerin eşleştirilmiş edilmiyor,: Örneğin, burada benim uygulamadan bir @Controller sınıfı. Uygulama yerel tomcat ortamımda başlatıldığında veya yeniden yüklendiğinde, her zamanki "Mapped URL"/render "to ..." konsolu çıkışını göremiyorum.

@Controller açıklamalı sınıfların bulunmamasını ve kaydedilmemesini engelleyebilecek neyi eksik olduğumu söyleyen var mı?

+0

: messageSource.setBasename ("/ WEB-INF/resources/messages"); MessageSource.setBasenames() ile birden fazla basenames nasıl eklenir? Basenames dizisi diyor, ama paramda bir dizi nasıl yerleştirileceğinden emin değilim. – Rihards

cevap

5

Ben @Controller s contextClass ve contextConfigLocation kök bağlamında (ContextLoaderListener 'ın bir, uygulanır (varsayılan olarak <servletname>-servlet.xml yüklenir) kendi uygulama bağlamında, gelen DispatcherServlet tarafından alınmayı gerektiği için bu olur sanırım hangi varsayılan olarak applicationContext.xml yüklenir).

DispatcherServlet s uygulama bağlamını yapılandırmak için, contextClass ve contextConfigLocation sunucularını init-param s olarak ayarlamanız gerekir.

DÜZENLEME: Bu davranış detectHandlersInAncestorContextsDefaultAnnotationHandlerMapping otel tarafından sisteme, yani alternatif bir yaklaşım yapılandırma sırasında true bunu ayarlamaktır edilir:

@Bean 
public DefaultAnnotationHandlerMapping mapping() { 
    DefaultAnnotationHandlerMapping m = new DefaultAnnotationHandlerMapping(); 
    m.setDetectHandlersInAncestorContexts(true); 
    return m; 
} 
+0

Dağıtıcı sunucu uygulamasının contextClass ve contextConfigLocation parametrelerini webapp ile aynı değerlere ayarlıyorum. Her şey iyi görünüyor, sanırım şimdi biraz kafam karıştı. Şu anda çalışan iki bağlam var mı? Daha önce, tüm XML yapılandırmalarını yaptığımda, web uygulamasını başlattığımda veya yeniden yüklediğimde URL eşlemeleri kayıt olur. Şimdi ilk gelen istekte bulunana kadar eşlenmiyorlar. –

+0

1) Evet, iki uygulama içeriğiniz var - kök içeriği ve DispatcherServlet'in içeriği, kök olanın alt öğesidir. Bu, Spring MVC uygulamaları için tipiktir, bkz. Http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-servlet. Bununla birlikte, aynı pakette ek açıklama tabanlı yapılandırmayı yüklemeleri iyi bir fikir değildir - çekirdekler çoğaltılabilir. 2) Servlet yüklendiğinde DispatcherServlet'in içeriği başlatılır, böylece 'ile kontrol edilebilir. 3) Alternatif çözümü ekledim. – axtavt

+0

Ahhhh ... Sanırım sonunda anladım. Çok teşekkürler. –

1

sizin mvc memuru servlet xml dosyasında nerede bu ekle Paket, tüm kontrolörler için @controller veya @Component için taranmalıdır.

<context:component-scan 
     base-package="packagesseperatedbycomma" /> 
+0

özellikle xml-less yapılandırmasını istediğini söyledi – Levancho

1

Ben bu sorunu ama benim web.xml için aşağıdaki kodu ekleyerek sabit: nerede benim denetleyicileri için bakmak için bunu söylemek

<servlet> 
     <servlet-name>Spring MVC Dispatcher Servlet</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <init-param> 
      <param-name>contextClass</param-name> 
      <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value> 
     </init-param> 
     <init-param> 
      <param-name>contextConfigLocation</param-name> 
      <param-value>org.xxxx.inquiry.config, org.xxxx.inquiry.controller</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

Ama bunu yaparken

Tek bir basename eklemek