2014-11-17 2 views
0

Я пытаюсь развернуть приложение Джерси на Apache Felix. У меня установлены эти комплекты:Pax-Web Jetty-Bundle Publishing Jersey App

ID|State  |Level|Name 
    0|Active  | 0|System Bundle (4.4.1) 
    1|Active  | 1|Apache Felix Bundle Repository (2.0.2) 
    2|Active  | 1|Apache Felix Gogo Command (0.14.0) 
    4|Active  | 1|Apache Felix Gogo Shell (0.10.0) 
    10|Active  | 1|Apache Felix Configuration Admin Service (1.2.8) 
    11|Active  | 1|Apache Felix EventAdmin (1.2.10) 
    35|Active  | 1|Apache Felix Gogo Runtime (0.12.1) 
    90|Installed | 1|Apache Felix Log Service (1.0.0) 
    91|Resolved | 1|OSGi R4 Compendium Bundle (4.0.0) 
    92|Installed | 1|Apache Felix Declarative Services (1.6.0) 
    94|Installed | 1|Apache Felix Web Management Console (3.1.2) 
    95|Installed | 1|Apache Felix iPOJO WebConsole Plugins (1.6.0) 
    96|Resolved | 1|Apache Felix Shell Service (1.4.2) 
    119|Installed | 1|Servlet 2.1 API (1.0.0) 
    144|Active  | 1|OSGi JAX-RS Connector (4.1.0.201407081443) 
    147|Active  | 1|jersey-all (2.10.1) 
    157|Active  | 1|OPS4J Pax Web - Jetty Bundle (4.0.0) 
    158|Active  | 1|OPS4J Pax Web - Runtime (4.0.0) 
    163|Active  | 1|http://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.7/slf4j-api-1.7.7-sources.jar (0.0.0) 
    165|Active  | 1|Java Servlet API (3.0.1) 
    167|Active  | 1|OPS4J Pax Logging - API (1.8.1) 
    170|Active  | 1|Apache Felix Dependency Manager (3.2.0) 
    171|Active  | 1|OPS4J Pax Web - Extender - WAR (4.0.0) 
    174|Active  | 1|Apache Felix Dependency Manager Runtime (3.2.0) 
    177|Active  | 1|ASM (5.0.3) 
    178|Active  | 1|ASM commons classes (5.0.3) 
    179|Active  | 1|ASM Tree class visitor (5.0.3) 
    182|Active  | 1|Apache XBean OSGI Bundle Utilities (3.18.0) 
    183|Active  | 1|Apache XBean :: Classpath Resource Finder (3.18.0) 
    216|Active  | 1|Auth Test (2.0.0.SNAPSHOT) 

Последний, Auth Test - это приложение Джерси, которое я хочу опубликовать. Я могу установить пакет и запустить его. Когда я начинаю его я получаю эти журналы:

g! start 216 
Started Activator 
org.ops4j.pax.web.pax-web-extender-war[org.ops4j.pax.web.extender.war.internal.WebEventDispatcher] : Sending web event WebEvent [replay=false, type=DEPLOYING, bundle=platform-component-web-rest-service-authentication [216], extenderBundle=org.ops4j.pax.web.pax-web-extender-war [171], cause=null, timestamp=1416226629360, contextPath=/authentication, collisionIds=null, httpService=null, httpContext=null] for bundle platform-component-web-rest-service-authentication 
org.ops4j.pax.web.pax-web-extender-war[org.ops4j.pax.web.extender.war.internal.WebEventDispatcher] : org/osgi/service/web/DEPLOYING 
org.ops4j.pax.web.pax-web-extender-war[org.ops4j.pax.web.extender.war.internal.parser.WebAppParser] : version found in web.xml - 3.0 
org.ops4j.pax.web.pax-web-extender-war[org.ops4j.pax.web.extender.war.internal.parser.WebAppParser] : metadata-complete is: false 
org.ops4j.pax.web.pax-web-extender-war[org.ops4j.pax.web.extender.war.internal.parser.WebAppParser] : scanning for ServletContainerInitializers 
org.ops4j.pax.web.pax-web-extender-war[org.ops4j.pax.web.extender.war.internal.parser.WebAppParser] : found container initializers by SafeServiceLoader ... skip the old impl. 
org.ops4j.pax.web.pax-web-extender-war[org.ops4j.pax.web.extender.war.internal.Activator] : Scheduling start of extension for bundle platform-component-web-rest-service-authentication asynchronously 
org.ops4j.pax.web.pax-web-extender-war[org.ops4j.pax.web.extender.war.internal.WebAppPublisher] : Publishing web application [WebApp{displayName=Authentication Manager,contextName=authentication,m_httpContext=null}] 

Я предполагаю, что вся проблема в том, за web.xml, который выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
    id="platform-component-web-rest-manager-authentication" version="3.0"> 


    <display-name>Authentication Manager</display-name> 


    <!-- ****************************************************************** --> 
    <!-- SERVLETS --> 
    <!-- ****************************************************************** -->   
    <servlet> 
     <servlet-name>wd-platform-product-web</servlet-name> 
     <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 
     <init-param> 
      <param-name>jersey.config.server.provider.packages</param-name> 
      <param-value> 
       com.mycompany.platform.component.web.rest; 
       com.mycompany.wd.platform.component.web.rest, 
      </param-value> 
     </init-param> 
     <init-param> 
      <param-name>jersey.config.server.provider.scanning.recursive</param-name> 
      <param-value>true</param-value> 
     </init-param> 
     <init-param> 
      <param-name>jersey.config.server.provider.classnames</param-name> 
      <param-value> 
       com.wordnik.swagger.jersey.listing.ApiListingResourceJSON; 
       com.wordnik.swagger.jersey.listing.JerseyApiDeclarationProvider; 
       com.wordnik.swagger.jersey.listing.JerseyResourceListingProvider 
      </param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>wd-platform-product-web</servlet-name> 
     <url-pattern>/rest/2.0.0/*</url-pattern> 
    </servlet-mapping> 


    <servlet> 
     <servlet-name>swagger-default-jaxrs-config</servlet-name> 
     <servlet-class>com.wordnik.swagger.jaxrs.config.DefaultJaxrsConfig</servlet-class> 
     <init-param> 
      <param-name>api.version</param-name> 
      <param-value>2.0.0</param-value> 
     </init-param> 
     <init-param> 
      <param-name>swagger.api.basepath</param-name> 
      <param-value>/rest/2.0.0/</param-value> 
     </init-param> 
     <load-on-startup>2</load-on-startup> 
    </servlet> 

</web-app> 

Мой класс активатором является стандартной моделью:

import java.util.HashMap; 
import javax.servlet.ServletContextEvent; 
import javax.servlet.ServletContextListener; 
import org.osgi.framework.BundleActivator; 
import org.osgi.framework.BundleContext; 
import org.osgi.framework.ServiceReference; 
import org.osgi.service.event.Event; 
import org.osgi.service.event.EventAdmin; 

/** 
* This is to make sure we signal the application has been deployed/un-deployed 
* via the OSGi EventAdmin service. 
* 
* @author Jakub Podlesak (jakub.podlesak at oracle.com) 
*/ 
public class WebAppContextListener implements BundleActivator, ServletContextListener { 

    static EventAdmin ea; 

    BundleContext bc; 
    ServiceReference eaRef; 

    synchronized static EventAdmin getEa() { 
     return ea; 
    } 

    synchronized static void setEa(EventAdmin ea) { 
     WebAppContextListener.ea = ea; 
    } 

    @Override 
    public void contextInitialized(final ServletContextEvent sce) { 
     if (getEa() != null) { 
      final String contextPath = sce.getServletContext().getContextPath(); 
      getEa().sendEvent(new Event("jersey/test/DEPLOYED",new HashMap<String, String>(){{ 
       put("context-path", contextPath);}})); 
     } 
    } 

    @Override 
    public void contextDestroyed(final ServletContextEvent sce) { 
     if (getEa() != null) { 
      getEa().sendEvent(new Event("jersey/test/UNDEPLOYED",new HashMap<String, String>(){{put("context-path", sce.getServletContext().getContextPath());}})); 
     } 
    } 

    @Override 
    public void start(BundleContext context) throws Exception { 
     System.out.println("Started Activator"); 
     bc = context; 
     eaRef = bc.getServiceReference(EventAdmin.class.getName()); 
     if (eaRef != null) { 
      setEa((EventAdmin)bc.getService(eaRef)); 
     } 
    } 

    @Override 
    public void stop(BundleContext context) throws Exception { 
     if (eaRef != null) { 
      setEa(null); 
      bc.ungetService(eaRef); 
     } 
    } 
} 

И моя главная служба REST выглядит следующим образом:

@Path("/service/authentication") 
@Api(value = "/service/authentication", description = "Authentication Service") 
public class AuthenticationServiceRestService extends RestService 
{ 

    ServiceLayer<Request<?>> serviceLayer; 
    AuthenticationLayer<Request<?>> authenticationLayer; 
    ExceptionLayer<Request<?>> exceptionLayer; 


    public AuthenticationServiceRestService() throws AuthenticationServiceRestServiceException 
    { 
     this.serviceLayer = new ServiceLayer<Request<?>>(); 

     try 
     { 
      this.authenticationLayer = new AuthenticationLayer<Request<?>>(this.serviceLayer); 
     } 
     catch (AuthenticationServiceException exception) 
     { 
      throw new AuthenticationServiceRestServiceException(exception.getMessage(), exception); 
     } 

     this.exceptionLayer = new ExceptionLayer<Request<?>>(this.authenticationLayer); 
    } 


    @POST 
    @Path("/auth") 
    @Consumes(MediaType.APPLICATION_JSON) 
    @Produces(MediaType.APPLICATION_JSON) 
    @ApiOperation(value = "Get authentication token.", response = AuthenticationTokenFacade.class) 
    public Response getAuthenticationToken(@ApiParam(value = "Authentication Data", required = true) AuthenticationRequestFacade authenticationRequestFacade) 
    { 
     System.out.println("auth request"); 
     GetAuthenticationTokenJsonRequest getAuthenticationTokenJsonRequest = new GetAuthenticationTokenJsonRequest(authenticationRequestFacade); 

     return exceptionLayer.execute(getAuthenticationTokenJsonRequest); 
    } 

Когда я делаю запрос POST на http://localhost:8080/authentication/rest/2.0.0/service/authentication/auth, я получаю 404. Я даже не знаю, опубликовано ли все мое обслуживание на пристани. Как я могу это сделать? Jetty отображает это в середине массивного бревна, когда я делаю этот запрос:

org.ops4j.pax.logging.pax-logging-api[org.ops4j.pax.web.service.spi.model.ServerModel] : Matching [/authentication/rest/2.0.0/service/authentication/auth]... 
org.ops4j.pax.logging.pax-logging-api[org.ops4j.pax.web.service.spi.model.ServerModel] : Path [/authentication/rest/2.0.0/service/authentication/auth] does not match any context 

Любая помощь, чтобы сделать эту работу было бы здорово. Спасибо заранее и извините за длинный вопрос, но я должен был убедиться, что вся информация предоставлена.

ответ

1

Во-первых, спасибо за подробный вопрос, это намного лучше, так что отсутствует только версия Pax Web, которую вы используете ;-)
Во-вторых, вам может быть интересно использовать Karaf с Pax Web. Это легко установить Pax-Web в Karaf, выполнив команду

feature:install war 

иметь Pax Web установлен внутри Karaf. Теперь почему я предлагаю это сначала, потому что вы сказали, что не знаете, действительно ли приложение доступно. Для этого есть две команды, доступные в оболочке Karaf, которые расскажут вам, есть она или нет. Один будет

web:list 

другой является

http:list 

либо один даст вам список а) расслоения веб-приложения, развернутые или б) сервлеты зарегистрированные.

Это даст вам лучшее представление о развернутом приложении.
Теперь я не понимаю, почему у вас есть активатор в вашем WebApplicationBundle (WAB), потому что для WAB вы просто используете «обычную» войну с OSGi Manifest, включая Web-ContextPath. Оттуда WebExtender выполнит эту работу для вас, так как в вашем случае это было сделано. Если вы хотите использовать ServletContextListener, зарегистрируйте его обычным способом в web.xml или с тех пор, как вы используете Servlet3 web.xml со стандартными аннотациями.

Теперь последняя часть сообщения журнала сообщает вам об этом при выдаче запроса на сервер, не было найдено httpContext для запроса. Причина этого, скорее всего, будет где-то в длинных журналах, которые у вас были до этого. Возможно, что-то случилось с регистрацией сервлета.Опять же, команда web: list может помочь получить еще лучшее изображение.

Поскольку Pax Web не был явно протестирован на это :-), может быть интересно представить простой пример веб-сообществу Pax, чтобы добавить его в образцы и провести тесты интеграции. Также всегда хорошо спрашивать в списке рассылки ops4j.