2013-05-14 22 views
10

Tôi đang cố gắng giảm thiểu cấu hình cần thiết trong khi triển khai dịch vụ Web dựa trên JAX-WS trên Tomcat. Với sự ra đời của Servlet 3.0 (được hỗ trợ bởi Tomcat 7+), web.xml có thể được ném ra ngoài, nhưng vẫn còn sun-jaxws.xml. blog post Đây là thú vị:Dịch vụ web JAX-WS trên Tomcat mà không cần sun-jaxws.xml

Tất nhiên, với việc sử dụng các chú thích JAX-WS, thậm chí cấu hình nắng jaxws.xml thể được thực hiện tùy chọn làm cho nó hoàn toàn mô tả miễn phí, nhưng điều đó đòi hỏi phải xác định một url- mặc định mẫu như trong JSR-109 hoặc mẫu tùy chỉnh như trong dịch vụ REST của Jersey, trong đặc tả JAX-WS .

Có thể tránh sun-jaxws.xml trên Tomcat và cách thực hiện?

Trả lời

12

Rất tiếc, cấu hình phải tồn tại ở đâu đó. Đó là bắt buộc, theo nguồn. Tin hay không, the location of the sun-jaxws.xml file is hard-coded tới /WEB-INF/sun-jaxws.xml (cảm ơn, guys @ Metro).

có hiệu quả, bạn cần phải thực hiện kiểm soát các lớp sau


Những gì cần phải xảy ra:

  1. WSServletContextListener rõ ràng là không được gia hạn. Trình lắng nghe này thực hiện hầu hết các khởi tạo trên tệp sun-jaxws.xml và jaxws-catalog. Như tôi đã đề cập trước đó, vị trí được mã hóa cứng. Vì vậy, con đường của bạn ít đề kháng ở đây là để

    • thực hiện riêng nghe vani servlet của bạn (với @WebListener) và gọi một new WSServletContextListener(). Sau đó, bạn sẽ ủy quyền các phương thức contextInitialized(ServletContext ctxt)contextDestroyed() của riêng mình cho các phương thức trong trường hợp của bạn là WSServletContextListener.

    • Tạo tệp ngay lập tức của người nghe, khi đang di chuyển, sử dụng lớp @XmlRootElement sẽ đại diện cho tệp sun-jaxws (tôi sẽ cung cấp mẫu này trong một thời gian ngắn, không có thời gian ngay bây giờ :)).

Đó là một rất nhiều rắc rối cho một sự tiện lợi có thể bỏ như vậy, IMO, nhưng nó phải làm việc trong lý thuyết. Tôi sẽ viết một số mẫu và xem cách chúng phát ngay.

+1

+1, không biết vị trí của 'sun-jaxws.xml' được mã hóa cứng :) Điều gì về mẫu url mặc định sẽ tạo tùy chọn' sun-jaxws.xml' (xem blog tôi đã trích dẫn trong câu hỏi của tôi), bạn có biết gì về nó không? –

+0

@MiljenMikic đọc bài đăng đó một cách cẩn thận, tất cả dường như có rất nhiều suy nghĩ mơ hồ và không có nhiều tham chiếu: Liên kết trong bài đăng blog của anh ấy đã chết. Tôi vẫn quản lý để theo dõi các nguồn ông đã đề cập đến [ở đây] (http://jarvana.com/jarvana/inspect/com/sun/xml/ws/jaxws-ri/2.2.2-promoted-b03/jaxws- ri-2.2.2-promoted-b03.zip?folder=jaxws-ri/samples/optional_webxml/) và [readme.txt] (http://jarvana.com/jarvana/view/com/sun/xml/ws /jaxws-ri/2.2.2-promoted-b03/jaxws-ri-2.2.2-promoted-b03.zip!/jaxws-ri/samples/optional_webxml/Readme.txt) vẫn cho biết sun-jaxws.xml là cần thiết – kolossus

0

Bạn phải xuất bản dịch vụ web. Bạn có thể thực hiện một ServletContextListener và công bố thiết bị đầu cuối:

@javax.servlet.annotation.WebListener 
public class AppServletContextListener implements javax.servlet.ServletContextListener { 

    public void contextInitialized(ServletContextEvent sce) { 
     Endpoint.publish("{protocol}://{host}:{port}/{context}/{wsName}", new MyHelloWorldWSImpl()); 
    } 

    public void contextDestroyed(ServletContextEvent sce) { 
     .... 
    } 
} 

nắng jaxws.xml không bắt buộc bởi thông số kỹ thuật ... Nếu bạn lưu ý, ví dụ, glassfish (tàu điện ngầm) làm cho nó không bắt buộc. Ngoài ra, nếu bạn hiển thị EJB 3.1 dưới dạng webservice (với jaxws), bạn có thể thấy không có tệp sun-jaxws.xml trong bản dựng được tạo.

+1

Cảm ơn câu trả lời. Tuy nhiên, tôi không muốn sử dụng cơ sở hạ tầng Endpoint.publish (..) vì nó đại diện cho một máy chủ HTTP nhẹ - nếu tôi muốn điều đó, tôi sẽ không sử dụng Tomcat. Tiếp theo, Tomcat là một thùng chứa servlet; nói cách khác bạn không thể triển khai EJB trên Tomcat. Tôi biết rằng nó hoạt động như một quyến rũ trong Glassfish, nhưng đó là bởi vì Glassfish là JSR-109-compliant. –

+0

Tomcat không hỗ trợ EJB theo mặc định. Bạn nên xem xét việc sử dụng, ví dụ, TomEE. Tôi đã đề cập đến EJB chỉ để làm ví dụ để chứng minh không có nhu cầu của sun-jaxws.xml (Nó không bắt buộc). –

+0

Cá nhân, tôi sẽ luôn thích máy chủ ứng dụng đầy đủ hơn (chẳng hạn như Glassfish) trên thùng chứa servlet (như Tomcat). Tuy nhiên, khách hàng của chúng tôi sử dụng Tomcat và tôi tò mò nếu có thể đơn giản hóa một cấu hình cần thiết cho việc triển khai các dịch vụ Web trên Tomcat. Vì vậy, câu hỏi của tôi là đặc biệt về Tomcat, không phải TomEE hay Glassfish. –

1

Tôi có dịch vụ web được công khai thành công theo cách này. Tôi đã sử dụng apache cfx để xuất bản trong servletContextListener.

@WebListener 
public class WebServicePublisListener implements ServletContextListener { 

    /** 
    * Default constructor. 
    */ 
    public WebServicePublisListener() { 
     // TODO Auto-generated constructor stub 
    } 

    /** 
    * @see ServletContextListener#contextInitialized(ServletContextEvent) 
    */ 
    public void contextInitialized(ServletContextEvent sce) { 
     JaxWsServerFactoryBean srvFactory = new JaxWsServerFactoryBean(); 
     srvFactory.setServiceClass(RandService.class); 
     srvFactory.setAddress("/RandService"); 
     srvFactory.setServiceBean(new RandServiceImplement()); 
     srvFactory.create(); 
    } 
+1

Cảm ơn câu trả lời. Tôi đã gắn thẻ câu hỏi của mình với các thẻ "JAX-WS RI" hoặc "Metro", vì 'sun-jaxws.xml' có liên quan đến những triển khai này.Apache CXF là triển khai khác nhau của JAX-WS, vì vậy nó không có gì với 'sun-jaxws.xml'. –

1

Để có hỗ trợ JAX-WS trong Tomcat bạn phải cấu hình:

  • WEB-INF/CN-jaxws.xml
  • WSServletContextListener
  • WSServlet

Thật không may là khó bỏ qua tệp WEB-INF/sun-jaxws.xml nhưng có cách dễ dàng hơn để bỏ qua cấu hình web.xml vì API Servlet 3.0.

Bạn có thể làm một cái gì đó như thế này:

@WebServlet(name = "ServiceServlet" , urlPatterns = "/service", loadOnStartup = 1) 
public class Servlet extends WSServlet { 

} 

@WebListener 
public class Listener implements ServletContextAttributeListener, ServletContextListener { 

    private final WSServletContextListener listener; 

    public Listener() { 
     this.listener = new WSServletContextListener(); 
    } 

    @Override 
    public void attributeAdded(ServletContextAttributeEvent event) { 
     listener.attributeAdded(event); 
    } 

    @Override 
    public void attributeRemoved(ServletContextAttributeEvent event) { 
     listener.attributeRemoved(event); 
    } 

    @Override 
    public void attributeReplaced(ServletContextAttributeEvent event) { 
     listener.attributeReplaced(event); 
    } 

    @Override 
    public void contextInitialized(ServletContextEvent sce) { 
     listener.contextInitialized(sce); 
    } 

    @Override 
    public void contextDestroyed(ServletContextEvent sce) { 
     listener.contextDestroyed(sce); 
    } 
} 

Tôi đã thử nghiệm nó trên Tomcat-8.5.23 phiên bản và nó hoạt động. Nhưng hãy nhớ rằng bạn vẫn phải có tệp WEB-INF/sun-jaxws.xml.

<endpoints xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime" 
     version="2.0"> 
    <endpoint name="SampleService" 
      implementation="com.ws.ServiceImpl" 
      url-pattern="/service" /> 
</endpoints> 
+0

Tôi biết rằng chúng tôi có thể bỏ qua tệp 'web.xml', đã được đề cập trong phần văn bản của câu hỏi. Câu hỏi đặt ra là bỏ qua tệp «sun-jaxws.xml'. –

+0

Ahh được nhưng tôi đã thêm giải pháp cho những người khác có thể không biết cách bỏ qua tệp web.xml cho vấn đề này. Ví dụ, tôi đã có vấn đề đó vài tuần trước. –

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