2013-07-15 162 views
5

有誰知道如何配置它,以便SOAP服務和REST服務可以在應用程序服務器之外使用Jersey(Grizzly)共享相同的端口?如何在同一端口託管SOAP服務和REST服務?

  • 我SOAP服務是在www.someurl.com:port/soap/crm
  • 我休息服務是在www.someurl.com:port/crm

這些服務共享同端口但不是相同的基本URL,因此應該能夠在該端口上並排運行。然而,有一個端口綁定錯誤..

所有這一切都在一個自定義的服務應用程序並沒有web.xml文件或這樣的。

的REST服務使用新澤西州和SOAP服務是在端點上發表的一類「ReceptionService」。 ':地址已在使用中:java.net.BindException綁定'

URI soapUri = URI.create("192.168.0.0:1234\soap\Crm") 
URI restUri = URI.create("192.168.0.0:1234\crm") 

// START SOAP SERVICE 
Object reception = getObjectResource(ReceptionService.class); 
Endpoint e = Endpoint.publish(soapUri, reception); 

// START REST SERVICE  
ResourceConfig rc = new ResourceConfig().packages("company.rest"); 
HttpServer server = GrizzlyHttpServerFactory.createHttpServer(restUri, rc); 

當我嘗試這一點,灰熊吐出

我SOAP服務前臺的設置是這樣的:

@WebService(targetNamespace = "company.crm") 
    @SOAPBinding(style = SOAPBinding.Style.DOCUMENT, use = SOAPBinding.Use.LITERAL,  parameterStyle = SOAPBinding.ParameterStyle.WRAPPED) 
    public class Reception implements ReceptionService { 
    ... methods 
    } 

我休息服務類像往常一樣註釋...

@Path("hello/{username}") 
public class Hello { ... } 

我有點新手在這個nd任何指針,將不勝感激。請不要打擾我建議我運行應用程序服務器。這不是問題 - 問題是如何解決端口綁定問題而不移動到其他Web服務框架?

注RE BOUNTY:我不能ITERATE這還不夠

「賞金優勝者將演示如何使用新澤西州的REST和Java SOAP服務(註釋JAX-WS)一起在同一端點答案將不需要修改Rest和Soap註釋類,但是,HTTP服務器代碼更改或配置更改以使其工作是可接受的。切換到Jetty或其他應用程序服務器是不可接受的該解決方案必須100%嵌入並運行Java SE和Java Web服務庫「。

+0

有點更多的信息會有幫助,例如你使用哪種類型的Web服務器/應用程序服務器? 'web.xml'看起來像什麼? –

+0

您是否找到了解決方案?我面臨同樣的問題 –

+0

沒有。我仍然讓他們分開的端口。我將不得不重做我的代碼,我沒有時間和耐心。希望將來可以配置。 –

回答

1

如果您使用的是常見的容器如Tomcat爲您web服務,那麼你可以得到兩個到達同一個端口上的服務請求。您可以將REST和基於SOAP的服務部署爲應用程序的一部分。容器將接受傳入請求並根據應用程序上下文將它們轉發給應用程序。在您的應用程序web.xml中,您可以根據請求URL映射來配置發送請求的位置。

+0

謝謝。我在客戶服務器應用程序中使用Jersey(Glassfish以外)。我會在上面發佈更多信息,也許有人有解決方案。 –

2

你所說的也不過是公開服務兩種不同的接口,是的,你可以承載他們在一個端口上只在同一容器中部署它,你將有兩個界面運行起來。

只要確保你沒有上下文路徑衝突,這似乎並沒有在上面的問題中提到的網址發生。

例如讓其餘的接口被部署爲:

www.someurl。com:port2/crm,所以不應該將soap部署在同一個url中,www.someurl.com:port1/soap/crm,這是正確的。

你還應該解釋一下你是如何部署接口的,作爲單獨的war文件還是在單個war文件中。

+0

謝謝。但我需要他們共享相同的URL端口。沒有戰爭文件,沒有應用程序服務器,只是編碼如上。它可以在單獨的端口上正常工作,但在共享相同端口時會導致綁定異常(儘管端點實際上是不同的)。 –

+0

問題在於,Endpoint.publish將啓動,HTTP Server和Grizzly部分也會啓動HTTP因爲這個服務器你有一個端口衝突。 –

+0

那麼我怎麼讓灰熊也提供肥皂服務? IE瀏覽器。並行發佈接待服務? 必須有一種方法,因爲Microsoft Server和Apache CMX也允許相同的行爲。 –

1

無法在同一個端口上啓動多個服務。

當您希望您的應用程序可通過同一端口訪問時,您必須使用應用程序 服務器。

您必須注意,服務器上的兩個應用都可以使用不同的URL(web.xml)訪問。

現在可以通過相同的端口訪問同一應用程序服務器上的所有應用程序。

+0

如果可以使用應用程序服務器完成,則可以在沒有編程的情況下完成。那麼Glassfish如何在同一個端口上使用球衣(grizzly http)作爲其餘服務器和肥皂服務......這是百萬美元的問題:) –

4

Jetty的覆蓋功能允許您在同一個Jetty實例/端口上部署兩個不同路徑的不同路徑。

您將擁有一個帶有Jersey servlet的web.xml(適用於REST),另一個帶有SOAP servlet的web.xml。

http://www.eclipse.org/jetty/documentation/current/overlay-deployer.html

+0

好的。如果我將這一切都轉移到Jetty,這可能會奏效。由於我現在使用Jetty來處理Restful事物,因爲我喜歡它與Guice輕鬆配置的方式,所以也許Soap也可以這樣。 –

+0

但是,它必須是一個不涉及web.xml文件的解決方案。如果你可以展示如何用Jetty和沒有xml文件來做到這一點,那麼我會考慮一個正確的答案。 –

0

這是大多數代碼我使用單個端口(2個不同的上下文路徑),(使用灰熊明顯)完全嵌入在我的應用程序上同時承載休息和肥皂服務,以及彈簧,其構造的。 ..

package com.mycompany.structure.web.grizzly; 

import java.io.IOException; 
import java.lang.reflect.Constructor; 
import java.net.BindException; 
import java.util.EnumSet; 
import java.util.LinkedList; 
import javax.servlet.DispatcherType; 
import javax.servlet.Servlet; 
import com.mycompany.structure.web.jersey.jackson.JsonResourceConfig; 
import com.mycompany.structure.web.jersey.spring.ExposedApplicationContext; 
import org.glassfish.grizzly.http.server.HttpHandler; 
import org.glassfish.grizzly.http.server.HttpServer; 
import org.glassfish.grizzly.http.server.NetworkListener; 
import org.glassfish.grizzly.jaxws.JaxwsHandler; 
import org.glassfish.grizzly.servlet.WebappContext; 
import org.glassfish.jersey.servlet.ServletContainer; 
import org.smallmind.nutsnbolts.lang.web.PerApplicationContextFilter; 
import org.springframework.beans.BeansException; 
import org.springframework.beans.factory.DisposableBean; 
import org.springframework.beans.factory.config.BeanPostProcessor; 
import org.springframework.context.ApplicationContext; 
import org.springframework.context.ApplicationContextAware; 
import org.springframework.context.ApplicationEvent; 
import org.springframework.context.ApplicationListener; 
import org.springframework.context.event.ContextRefreshedEvent; 

public class GrizzlyInitializingBean implements DisposableBean, ApplicationContextAware, ApplicationListener, BeanPostProcessor { 

    private static final Class[] NO_ARG_SIGNATURE = new Class[0]; 
    private HttpServer httpServer; 
    private LinkedList<WebService> serviceList = new LinkedList<>(); 
    private ServletInstaller[] servletInstallers; 
    private String host; 
    private String contextPath; 
    private String restPath; 
    private String soapPath; 
    private int port; 
    private boolean debug = false; 

    public void setHost (String host) { 

    this.host = host; 
    } 

    public void setPort (int port) { 

    this.port = port; 
    } 

    public void setContextPath (String contextPath) { 

    this.contextPath = contextPath; 
    } 

    public void setRestPath (String restPath) { 

    this.restPath = restPath; 
    } 

    public void setSoapPath (String soapPath) { 

    this.soapPath = soapPath; 
    } 

    public void setServletInstallers (ServletInstaller[] servletInstallers) { 

    this.servletInstallers = servletInstallers; 
    } 

    public void setDebug (boolean debug) { 

    this.debug = debug; 
    } 

    @Override 
    public synchronized void onApplicationEvent (ApplicationEvent event) { 

    if (event instanceof ContextRefreshedEvent) { 

     if (debug) { 
     System.setProperty("com.sun.xml.ws.transport.http.HttpAdapter.dump", "true"); 
     } 
     httpServer = new HttpServer(); 
     httpServer.addListener(new NetworkListener("grizzly2", host, port)); 

     WebappContext webappContext = new WebappContext("Grizzly Application Context"); 
     webappContext.addServlet("JAX-RS Application", new ServletContainer(new JsonResourceConfig(ExposedApplicationContext.getApplicationContext()))).addMapping(restPath + "/*"); 
     webappContext.addFilter("per-application-data", new PerApplicationContextFilter()).addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), restPath + "/*"); 
     webappContext.addListener("org.springframework.web.context.request.RequestContextListener"); 

     for (ServletInstaller servletInstaller : servletInstallers) { 
     try { 

      Constructor<? extends Servlet> servletConstructor; 
      Servlet servlet; 
      String urlPattern; 

      servletConstructor = servletInstaller.getServletClass().getConstructor(NO_ARG_SIGNATURE); 
      servlet = servletConstructor.newInstance(); 

      webappContext.addServlet(servletInstaller.getDisplayName(), servlet).addMapping((urlPattern = servletInstaller.getUrlPattern()) == null ? "/" : urlPattern); 
     } 
     catch (Exception exception) { 
      throw new GrizzlyInitializationException(exception); 
     } 
     } 

     webappContext.deploy(httpServer); 

     for (WebService webService : serviceList) { 

     HttpHandler httpHandler = new JaxwsHandler(webService.getService(), false); 

     httpServer.getServerConfiguration().addHttpHandler(httpHandler, soapPath + webService.getPath()); 
     } 

     try { 
     httpServer.start(); 
     } 
     catch (IOException ioException) { 
     if (!(ioException instanceof BindException)) { 
      throw new GrizzlyInitializationException(ioException); 
     } 
     } 
    } 
    } 

    @Override 
    public void setApplicationContext (ApplicationContext applicationContext) { 

    ExposedApplicationContext.register(applicationContext); 
    } 

    @Override 
    public Object postProcessBeforeInitialization (Object bean, String beanName) throws BeansException { 

    return bean; 
    } 

    @Override 
    public Object postProcessAfterInitialization (Object bean, String beanName) throws BeansException { 

    ServicePath servicePath; 

    if ((servicePath = bean.getClass().getAnnotation(ServicePath.class)) != null) { 
     serviceList.add(new WebService(servicePath.value(), bean)); 
    } 

    return bean; 
    } 

    @Override 
    public synchronized void destroy() { 

    if (httpServer != null) { 
     httpServer.shutdown(); 
    } 
    } 
} 
+0

太棒了。我會看看它。 –