# URL-Mapping mit Stateless Beans



## Goldfish (6. Jul 2015)

Hi, ich habe gerade das Problem, dass ich nicht herausfinde, wie ich meien Stateless Beans ordentlich auf URLs mappe. Wenn ich eine simple Anwendung mit nur einer Stateless-Bean deploye, läuft alles wunderbar. Jetzt hab ich aber das Problem, dass ich bspw. eine Anwendung mit JSF habe und das Mapping in der web.xml wie folgt angegeben habe:


```
<servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.xhtml</url-pattern>
    </servlet-mapping>
    <welcome-file-list>
        <welcome-file>index.xhtml</welcome-file>
    </welcome-file-list>

    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>
```

Anschließend ist das Ergebnis, dass die URLs mit den Stateless Beans nicht mehr mappen und ich diese nicht mehr erreichen kann. Ich habe keine explizite Anweisung in der web.xml, da ich nicht rausfinde, wie diese aussehen müssten. Die Bean sieht gerade so aus:


```
@Stateless
@Path(value = "test")
public class TestRessource {

    @GET
    @Path("call")
    @Produces({MediaType.APPLICATION_JSON, "text/plain"})
    public Object ladeSchhluessel () throws Exception {
        return "das ist ein test";
    }
}
```

Das gleiche Problem habe ich, wenn ich statt des JSF-Mappings noch einen Web-Service basierend auf JAX-WS einbinde. Die Stateless-Beans erreiche ich einfach nicht mehr. Wie muss ich die web.xml richtig konfigurieren? Oder wo gibt es eine vernünftige Anleitung bzw. Erklärung zu diesem Thema?


----------



## stg (6. Jul 2015)

Du kannst keine Stateless Bean direkt mappen, alle Anfragen laufen zunächst an ein Servlet. An welches wird in der web.xml definiert. Dass es in deinem ersten geschilderten Fall überhaupt funktioniert, liegt vermutlich daran, dass der Application Server trotz des fehlenden Eintrags das richtige finden konnte. Spätestens zu dem Zeitpunkt, als du weitere Mappings hinzugefügt hast, war er dann aber damit überfordert.

Bei mir sieht das Mapping so aus:

```
<servlet>
    <servlet-name>javax.ws.rs.core.Application</servlet-name>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>javax.ws.rs.core.Application</servlet-name>
    <url-pattern>/ws/*</url-pattern>
  </servlet-mapping>
```

Der Webservice aus deiner Stateless Bean wäre dann über

```
../ws/test/call
```
erreichbar.


----------



## Goldfish (6. Jul 2015)

sauber danke, jetzt läuft alles 
ich wusste einfach nicht, wie der Eintrag in der web.xml aussehen musste


----------



## Goldfish (6. Jul 2015)

ich muss das Thema leider noch einmal erneut aufrollen. Ich bin auf ein neues Problem gestoßen, dass sich mit diesem hier nahezu deckt.

Nachdem das Rumspielen vorhin funktioniert hat, bin ich eben auf die richtige Anwendung gegangen, wo der Kram am Ende laufen soll, wo das Mapping wieder nicht funktioniert. Ich habe auf dem Server 2 WebServices laufen und den Eintrag für die EJBs in die web.xml hinzugefügt. Aber aus irgendeinem Grund mapped die URL nicht. Das Servlet scheint erreicht zu werden, aber es kann wohl die Ressource nicht auflösen und ich kann mir nicht erklären wieso.


```
<!-- Für JBoss, damit nicht nach mehreren RS Implementierungen gesucht wird. -->
    <context-param>
        <param-name>resteasy.scan</param-name>
        <param-value>false</param-value>
    </context-param>
    <context-param>
        <param-name>resteasy.scan.providers</param-name>
        <param-value>false</param-value>
    </context-param>
    <context-param>
        <param-name>resteasy.scan.resources</param-name>
        <param-value>false</param-value>
    </context-param>


    <listener>
        <listener-class>
            com.sun.xml.ws.transport.http.servlet.WSServletContextListener
        </listener-class>
    </listener>
    <servlet>
        <servlet-name>FiverxLinkSecurityServiceServlet</servlet-name>
        <servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet>
        <servlet-name>FiverxLinkServiceServlet</servlet-name>
        <servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>FiverxLinkSecurityServiceServlet</servlet-name>
        <url-pattern>/FiverxLinkSecurityService</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>FiverxLinkServiceServlet</servlet-name>
        <url-pattern>/FiverxLinkServiceService</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>120</session-timeout>
    </session-config>


    <servlet>
        <servlet-name>javax.ws.rs.core.Application</servlet-name>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>javax.ws.rs.core.Application</servlet-name>
        <url-pattern>app/*</url-pattern>
    </servlet-mapping>
```

Die Bean ist die gleiche wie eben gerade. Aber ich erhalte nun immer die Exception:


```
13:01:16,661 WARN  [org.jboss.resteasy.core.ExceptionHandler] (default task-27) failed to execute: javax.ws.rs.NotFoundException: Could not find resource for full path: http://localhost:8080/FiverxLinkTest-0.0.0-SNAPSHOT/app/test/call
    at org.jboss.resteasy.core.registry.ClassNode.match(ClassNode.java:73) [resteasy-jaxrs-3.0.10.Final.jar:]
    at org.jboss.resteasy.core.registry.RootClassNode.match(RootClassNode.java:48) [resteasy-jaxrs-3.0.10.Final.jar:]
    at org.jboss.resteasy.core.ResourceMethodRegistry.getResourceInvoker(ResourceMethodRegistry.java:444) [resteasy-jaxrs-3.0.10.Final.jar:]
    at org.jboss.resteasy.core.SynchronousDispatcher.getInvoker(SynchronousDispatcher.java:234) [resteasy-jaxrs-3.0.10.Final.jar:]
    at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:171) [resteasy-jaxrs-3.0.10.Final.jar:]
    at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:220) [resteasy-jaxrs-3.0.10.Final.jar:]
    at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:56) [resteasy-jaxrs-3.0.10.Final.jar:]
    at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:51) [resteasy-jaxrs-3.0.10.Final.jar:]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) [jboss-servlet-api_3.1_spec-1.0.0.Final.jar:1.0.0.Final]
    at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:85) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
    at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:61) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
    at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
    at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) [undertow-core-1.1.0.Final.jar:1.1.0.Final]
    at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
    at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:56) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) [undertow-core-1.1.0.Final.jar:1.1.0.Final]
    at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:45) [undertow-core-1.1.0.Final.jar:1.1.0.Final]
    at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:63) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
    at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:58) [undertow-core-1.1.0.Final.jar:1.1.0.Final]
    at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:70) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
    at io.undertow.security.handlers.SecurityInitialHandler.handleRequest(SecurityInitialHandler.java:76) [undertow-core-1.1.0.Final.jar:1.1.0.Final]
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) [undertow-core-1.1.0.Final.jar:1.1.0.Final]
    at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) [undertow-core-1.1.0.Final.jar:1.1.0.Final]
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) [undertow-core-1.1.0.Final.jar:1.1.0.Final]
    at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:261) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
    at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:247) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
    at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:76) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
    at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:166) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
    at io.undertow.server.Connectors.executeRootHandler(Connectors.java:197) [undertow-core-1.1.0.Final.jar:1.1.0.Final]
    at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:759) [undertow-core-1.1.0.Final.jar:1.1.0.Final]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [rt.jar:1.7.0_75]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [rt.jar:1.7.0_75]
    at java.lang.Thread.run(Thread.java:745) [rt.jar:1.7.0_75]
```


----------

