2015-06-19 16 views
7

Tôi đang cố gắng chuyển đổi một ứng dụng web dựa trên web.xml thành khởi động mùa xuân nhưng đang gặp sự cố khi định cấu hình một HttpRequestHandlerServlet. Tôi có những điều sau đây trong web.xml của tôi:Cần trợ giúp chuyển đổi từ web.xml khởi động mùa xuân

<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> 

Các DispatcherServlet không phải là một vấn đề:

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

Nhưng tôi không thể tìm ra cách để cấu hình updateServlet.

Làm thế nào để cấu hình một servlet dựa trên HttpRequestHandlerServlet trong ứng dụng Khởi động mùa xuân?

Thông tin bổ sung:

Tôi đã thử câu trả lời được đề xuất nhưng không hiệu quả đối với tôi.

Một điều mà tôi không đề cập đến là UpdateServlet được đặt tên "updateServlet": componenet ("updateServlet") public class UpdateServlet thực hiện HttpRequestHandler

Đó xung đột tên với tên đậu trong câu trả lời. Sau khi thay đổi nó (cập nhật), tôi nhận được:

No bean named 'httpRequestHandlerServlet' is defined 

Sau khi thay đổi tên của updateServlet để httpRequestHandlerServlet, tôi nhận được

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] 

Trả lời

3

Đối với DispatcherServlet có một cách dễ dàng hơn nhiều chỉ cần thêm một dòng vào application.properties và xóa bean servlet khỏi lớp ứng dụng của bạn.

server.servlet-path=/ws/* 

Tiếp theo chỉ cần thêm định nghĩa của bạn của HttpRequestHandlerServlet với cấu hình của bạn thay vì DispatcherServlet.

@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:

Lưu ý, rằng việc sử dụng phương pháp updateServlet() là hoàn toàn hợp pháp ở đây, và có thể được sử dụng để có được dụ SpringBean (xem bình luận dưới đây).

+0

Bạn không nên sử dụng phương thức 'updateServlet()' trực tiếp trong 'updateServletRegistrationBean()', vì lệnh gọi trực tiếp sẽ tạo ra cá thể sẽ nằm ngoài 'ApplicationContext'. –

+2

Không, không. Các phương thức '@ Bean' được xử lý bởi mùa xuân và thực sự bị chặn. –

+0

Phương thức '@ Bean' không bị chặn, Spring sử dụng chúng để tạo các cá thể Spring Bean và gọi chúng là thủ công là vô nghĩa. Ở đây nó trông như thế nào: '@Bean public ServletRegistrationBean updateServletRegistrationBean (HttpRequestHandlerServlet updateServlet)'. Trong trường hợp này, Spring sẽ tiêm cá thể 'updateServlet' từ ApplicationContext. –

1

Bạn có thể muốn có một servlet làm bean Spring (hoặc ít nhất đây là phạm vi của HttpRequestHandlerServlet). Vấn đề là trong phương thức init của lớp này

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

tôi đã không tìm thấy một cách để thiết lập tên servlet với java cấu hình như bạn có thể làm trong web.xml, vì vậy trong trường hợp này tên servlet sẽ "httpRequestHandlerServlet" mặc định.

Bạn chỉ có thể có một servlet làm bean Spring và bạn phải đặt tên cho nó. Nếu bạn muốn nhiều servlet như thế này, thì bạn cần phải tìm cách khác.Giả sử bạn có servlet này:

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

Bạn có thể dễ dàng thiết lập tên bean sử dụng mã dưới đây (xin lưu ý phương pháp setName())

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

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

Bạn có thể có nhiều đường dẫn tùy chỉnh servlet tuyên bố cách này .

Các vấn đề liên quan