2015-06-19 13 views
7

से कनवर्ट करने में मदद की ज़रूरत है मैं एक वेब.एक्सएमएल आधारित वेब ऐप को वसंत बूट में बदलने की कोशिश कर रहा हूं लेकिन मुझे HttpRequestHandlerServlet को कॉन्फ़िगर करने में समस्या हो रही है। मैं अपने web.xml में निम्नलिखित है:web.xml वसंत बूट

<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 एक समस्या नहीं था:

@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/*"); 
    } 
} 

लेकिन मैं समझ नहीं updateServlet को कॉन्फ़िगर कैसे करें।

एक स्प्रिंग बूट एप्लिकेशन में एक HttpRequestHandlerServlet आधारित servlet को कैसे कॉन्फ़िगर करता है?

अतिरिक्त जानकारी:

मैं सुझाव दिया जवाब की कोशिश की लेकिन यह मेरे लिए काम नहीं करता।

एक बात है कि मैं उल्लेख नहीं था कि UpdateServlet "updateServlet" नाम दिया गया है: componenet ("updateServlet") सार्वजनिक वर्ग UpdateServlet लागू करता HttpRequestHandler

कि जवाब में सेम नाम के साथ नाम विरोध करता है। इसे बदलने (अद्यतन करने के लिए) के बाद, मैं मिलता है:

No bean named 'httpRequestHandlerServlet' is defined 

httpRequestHandlerServlet को updateServlet का नाम बदलने के बाद, मैं

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] 

उत्तर

3

DispatcherServlet के लिए मिलता है वहाँ एक बहुत ही आसान तरीका बस में रेखा जोड़ने है application.properties और अपने एप्लिकेशन क्लास से सर्वलेट बीन हटा दें।

server.servlet-path=/ws/* 

अगला सिर्फ अपने बजाय विन्यास DispatcherServlet करने के लिए HttpRequestHandlerServlet की अपनी परिभाषा जोड़ें।

@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"); 
    } 
} 

युपीडी:

ध्यान दें, कि updateServlet() पद्धति का उपयोग करके यहाँ बिल्कुल कानूनी है, और SpringBean उदाहरण (नीचे टिप्पणी देखें) प्राप्त करने के लिए इस्तेमाल किया जा सकता।

+0

आपको 'अपडेट सर्विलेट()' विधि का उपयोग सीधे 'अपडेट सर्विलेट पंजीकरण() 'विधि में नहीं करना चाहिए, क्योंकि प्रत्यक्ष आमंत्रण उदाहरण देगा जो' ApplicationContext' के बाहर होगा। –

+2

नहीं, यह नहीं होगा। '@ बीन 'विधियों को वसंत द्वारा संसाधित किया जाता है और वास्तव में अवरुद्ध होते हैं। –

+0

'बीन' विधियों को बिल्कुल भी अवरुद्ध नहीं किया जाता है, स्प्रिंग बीन उदाहरण बनाने के लिए वसंत का उपयोग करके उन्हें मैन्युअल रूप से बेकार कर दिया जाता है। यहां यह सही तरीके से कैसा दिखना चाहिए: '@ बीन पब्लिक सर्वलेट पंजीकरण, बीन अपडेट सर्विट पंजीकरण पंजीकरण (एचटीपीआरक्वेटहैंडलरर्वलेट अपडेट सर्विलेट) '। इस मामले में स्प्रिंग एप्लिकेशनकॉन्टेक्स्ट से 'अपडेट सर्वलेट' उदाहरण इंजेक्ट करेगा। –

1

शायद आप स्प्रिंग बीन के रूप में एक सर्वलेट चाहते हैं (या कम से कम यह HttpRequestHandlerServlet का दायरा है)। समस्या यह है, इस वर्ग के

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

मैं तुम्हें web.xml में कर सकता है के रूप में जावा config साथ सर्वलेट नाम स्थापित करने का एक तरीका नहीं मिला है की init विधि में है इसलिए इस मामले में सर्वलेट नाम होगा डिफ़ॉल्ट "httpRequestHandlerServlet"।

आप स्प्रिंग बीन के रूप में केवल एक सर्वलेट प्राप्त कर सकते हैं और आपको इसे यह नाम देना होगा। यदि आप इस तरह के एकाधिक सर्लेट चाहते हैं, तो आपको एक और तरीका खोजने की जरूरत है।मान लें तो आप इस सर्वलेट है:

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

आप आसानी से bellow कोड का उपयोग कर सेम नाम सेट कर सकते हैं (कृपया ध्यान दें setName() विधि)

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

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

आप एक से अधिक कस्टम सर्वलेट पथ हो सकता है इस तरह की घोषणा की ।

संबंधित मुद्दे