2015-06-19 38 views
7

Web.xml tabanlı bir web uygulamasını bahar önyüklemesine dönüştürmeye çalışıyorum ancak bir HttpRequestHandlerServlet yapılandırmasında sorun yaşıyorum. Benim Web.xml şu var:Web.xml yay önyüklemesini dönüştürme konusunda yardıma mı ihtiyacınız var

<servlet> 
    <servlet-name>webServices</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
<load-on-startup>1</load-on-startup> 
</servlet> 

<servlet> 
    <servlet-name>updateServlet</servlet-name> 
    <servlet-class>org.springframework.web.context.support.HttpRequestHandlerServlet</servlet-class> 
</servlet> 

<servlet-mapping> 
    <servlet-name>updateServlet</servlet-name> 
    <url-pattern>/update</url-pattern> 
</servlet-mapping> 

<servlet-mapping> 
    <servlet-name>webServices</servlet-name> 
    <url-pattern>/ws/*</url-pattern> 
</servlet-mapping> 

DispatcherServlet bir sorun değildi:

@SpringBootApplication 
public class WebApplication extends SpringBootServletInitializer 
{ 
    public static void main(String[] args) 
    { 
    SpringApplication.run(PoolWebApplication.class); 
    } 

    @Bean 
    public DispatcherServlet dispatcherServlet() 
    { 
    return new DispatcherServlet(); 
    } 

    @Bean 
    public ServletRegistrationBean servletRegistrationBean() 
    { 
    return new ServletRegistrationBean(dispatcherServlet(), "/ws/*"); 
    } 
} 

Ama updateServlet nasıl yapılandırılacağı bilemiyorum.

Bir Spring Boot uygulamasında bir HttpRequestHandlerServlet tabanlı sunucu uygulaması nasıl yapılandırılır?

Ek Bilgi:

Gösterdiğim cevabı denedik ama benim için çalışmıyor. Ben söz etmedi

Bir şey UpdateServlet "updateServlet" adlı olmasıdır: componenet ("updateServlet") public class UpdateServlet uygular HttpRequestHandler

O cevap fasulye adıyla adı çakışmaları. (Güncellemek için) bunu değiştirdikten sonra, alıyorum:

No bean named 'httpRequestHandlerServlet' is defined 

httpRequestHandlerServlet için updateServlet adını değiştirdikten sonra, ben DispatcherServlet için

org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'httpRequestHandlerServlet' must be of type [org.springframework.web.HttpRequestHandler], but was actually of type [org.springframework.web.context.support.HttpRequestHandlerServlet] 

cevap

3

olsun sadece bir satır eklemek çok daha kolay bir yolu var application.properties ve uygulama kasetini uygulama sınıfınızdan kaldırın.

server.servlet-path=/ws/* 

Sonraki sadece yapılandırma yerine DispatcherServlet için HttpRequestHandlerServlet sizin tanımı ekleyin.

@SpringBootApplication 
public class WebApplication extends SpringBootServletInitializer 
{ 
    public static void main(String[] args) 
    { 
    SpringApplication.run(PoolWebApplication.class); 
    } 

    @Bean 
    public HttpRequestHandlerServlet updateServlet() 
    { 
    return new HttpRequestHandlerServlet(); 
    } 

    @Bean 
    public ServletRegistrationBean updateServletRegistrationBean() 
    { 
    return new ServletRegistrationBean(updateServlet(), "/update"); 
    } 
} 

UPD:

Not updateServlet() yöntemi kullanarak burada kesinlikle yasaldır ve SpringBean örneğini (aşağıdaki yorumlara bakınız) elde etmek için kullanılabileceğini.

+0

"updateServlet()" yöntemini doğrudan "updateServletRegistrationBean()" yönteminde kullanmamalısınız, çünkü doğrudan çağrı, ApplicationContext öğesinin dışında olacak örneği üretecektir. –

+2

Hayır olmaz. 'Bean' yöntemleri ilkbaharda işlenir ve aslında durdurulur. –

+0

'@ Bean' yöntemlerine hiç müdahale edilmez, Spring Bean örneklerini oluşturmak için bunları kullanarak ve elle onları çağırmak anlamsızdır. İşte nasıl doğru şekilde görünmelidir: '@ Public public ServletRegistrationBean updateServletRegistrationBean (HttpRequestHandlerServlet updateServlet)'. Bu durumda, Spring, "updateServlet" örneğini ApplicationContext'ten enjekte edecektir. –

1

Muhtemelen bir Spring Bean (örneğin en azından bu HttpRequestHandlerServlet'in kapsamı) olarak bir sunucu uygulamasına sahip olmak istersiniz. Bu durumda servlet adı olacaktır, böylece sorun, sana web.xml''deki yapabileceği şekilde java config servlet adını ayarlamanın bir yolunu bulamadı

@Override 
public void init() throws ServletException { 
    WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext()); 
    this.target = wac.getBean(getServletName(), HttpRequestHandler.class); 
} 

bu sınıfın init yönteminde ise varsayılan "httpRequestHandlerServlet".

Yay fasulyesi olarak yalnızca tek bir sunucuya sahip olabilirsiniz ve bu adı vermeniz gerekir. Böyle bir çok servlet istiyorsanız, başka bir yol bulmanız gerekir.Bu sunucu uygulamasını sahip varsayalım: Birden fazla özel servlet yollara sahip olabilir

@Bean 
    public HttpRequestHandler image() { 
    return new ImageServlet(); 
    } 

    @Bean 
    public ServletRegistrationBean imageServletRegistrationBean() { 
    ServletRegistrationBean imageServlet = new ServletRegistrationBean(
     new HttpRequestHandlerServlet(), "/image/*"); 
    imageServlet.setName("image"); 
    return imageServlet; 
    } 

(isimAta() yöntemini lütfen unutmayın)

public class MySpringBeanServlet implements org.springframework.web.HttpRequestHandler{ 

    @Autowired 
    private SomeBean someBean; 

    @Override 
    public void handleRequest(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 

     //do your magic here 
    } 

} 

@SpringBootApplication 
public class WebApplication extends SpringBootServletInitializer{ 

    public static void main(String[] args){ 
     SpringApplication.run(PoolWebApplication.class); 
    } 

    /** 
    * This is the key, setting the bean name 
    **/ 
    @Bean(name="httpRequestHandlerServlet") 
    public HttpRequestHandler mySpringBeanServlet(){ 
     return new MySpringBeanServlet(); 
    } 

    @Bean 
    public ServletRegistrationBean updateServletRegistrationBean(){ 
     return new ServletRegistrationBean(new HttpRequestHandlerServlet();, "/update"); 
    } 
} 
1

Kolayca feryat kodu kullanarak fasulye adını ayarlayabilirsiniz bu şekilde beyan edilen .

İlgili konular