Hi,


I’m trying to register two JAXRS servers using one shared Jetty engine and
I’m getting an exception when one of them is restarted. I’m running CXF
3.1.5 within a Karaf based OSGi environment (jboss fuse 6.3.0).



Basically my setup is 2 separate OSGi bundles each with a JAXRS server
defined via spring. In one bundle I have defined my own Jetty engine bound
to a port, in the other I refer to this port in another similar JAXRS
service definition. On the shared Jetty engine I have attached a security
constraint handler provided by Redhat Keycloak, but I don't think this is
the source of the problem. This works fine when both bundles are deployed
sequentially, but once I restart the bundle that doesn’t have the engine
defined I get a 500 error every time I attempt to hit the endpoint. This is
the exception that is logged:



2017-07-03 06:39:16,810 | WARN  | qtp846639410-220 |
HttpChannel                      | ?                                   ? |
96 - org.eclipse.jetty.util - 9.2.19.v20160908 | /cxf/b/test

java.lang.NullPointerException

        at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(
AbstractHTTPDestination.java:254)[118:org.apache.cxf.cxf-
rt-transports-http:3.1.5.redhat-630187]

        at org.apache.cxf.transport.http_jetty.JettyHTTPDestination.
doService(JettyHTTPDestination.java:234)[239:org.apache.cxf.cxf-rt-
transports-http-jetty:3.1.5.redhat-630187]

        at org.apache.cxf.transport.http_jetty.JettyHTTPHandler.handle(
JettyHTTPHandler.java:70)[239:org.apache.cxf.cxf-rt-
transports-http-jetty:3.1.5.redhat-630187]

        at org.eclipse.jetty.server.session.SessionHandler.
doHandle(SessionHandler.java:223)[93:org.eclipse.jetty.
server:9.2.19.v20160908]

        at org.eclipse.jetty.server.handler.ContextHandler.
doHandle(ContextHandler.java:1127)[93:org.eclipse.jetty.
server:9.2.19.v20160908]

        at org.eclipse.jetty.server.session.SessionHandler.
doScope(SessionHandler.java:187)[93:org.eclipse.jetty.
server:9.2.19.v20160908]

        at org.eclipse.jetty.server.handler.ContextHandler.
doScope(ContextHandler.java:1061)[93:org.eclipse.jetty.
server:9.2.19.v20160908]

        at org.eclipse.jetty.server.handler.ScopedHandler.handle(
ScopedHandler.java:141)[93:org.eclipse.jetty.server:9.2.19.v20160908]

        at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(
ContextHandlerCollection.java:215)[93:org.eclipse.jetty.
server:9.2.19.v20160908]

        at org.eclipse.jetty.server.handler.HandlerCollection.
handle(HandlerCollection.java:110)[93:org.eclipse.jetty.
server:9.2.19.v20160908]

        at org.eclipse.jetty.server.handler.HandlerWrapper.handle(
HandlerWrapper.java:97)[93:org.eclipse.jetty.server:9.2.19.v20160908]

        at org.eclipse.jetty.server.Server.handle(Server.java:499)
[93:org.eclipse.jetty.server:9.2.19.v20160908]

        at org.eclipse.jetty.server.HttpChannel.handle(
HttpChannel.java:311)[93:org.eclipse.jetty.server:9.2.19.v20160908]

        at org.eclipse.jetty.server.HttpConnection.onFillable(
HttpConnection.java:257)[93:org.eclipse.jetty.server:9.2.19.v20160908]

        at org.eclipse.jetty.io.AbstractConnection$2.run(
AbstractConnection.java:544)[86:org.eclipse.jetty.io:9.2.19.v20160908]

        at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(
QueuedThreadPool.java:635)[96:org.eclipse.jetty.util:9.2.19.v20160908]

        at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(
QueuedThreadPool.java:555)[96:org.eclipse.jetty.util:9.2.19.v20160908]

        at java.lang.Thread.run(Thread.java:745)[:1.8.0_77]



This is the spring config I have in bundle 1 (this contains the Jetty
engine and associated constraint):



    <bean id="configResolver" class="org.keycloak.adapters.osgi.
PathBasedKeycloakConfigResolver"/>

    <bean id="keycloakAuthenticator" class="org.keycloak.adapters.jetty.
KeycloakJettyAuthenticator">

        <property name="configResolver" ref="configResolver"/>

    </bean>

    <bean id="constraint" class="org.eclipse.jetty.util.
security.Constraint">

        <property name="name" value="Services"/>

        <property name="roles">

            <list>

                <value>servicesUser</value>

            </list>

        </property>

        <property name="authenticate" value="true"/>

        <property name="dataConstraint" value="0"/>

    </bean>

    <bean id="constraintMapping" class="org.eclipse.jetty.
security.ConstraintMapping">

        <property name="constraint" ref="constraint"/>

        <property name="pathSpec" value="/*"/>

    </bean>

    <bean id="securityHandler" class="org.eclipse.jetty.security.
ConstraintSecurityHandler">

        <property name="authenticator" ref="keycloakAuthenticator" />

        <property name="constraintMappings">

            <list>

                <ref bean="constraintMapping" />

            </list>

        </property>

        <property name="authMethod" value="BASIC"/>

        <property name="realmName" value="does-not-matter"/>

    </bean>



    <httpj:engine-factory bus="cxf" id="kc-cxf-endpoint">

        <httpj:engine port="8282">

            <httpj:tlsServerParameters>

                <!-- As described in http://cxf.apache.org/docs/
client-http-transport-including-ssl-support.html -->

            </httpj:tlsServerParameters>

            <httpj:handlers>

                <ref bean="securityHandler" />

            </httpj:handlers>

            <httpj:sessionSupport>true</httpj:sessionSupport>

        </httpj:engine>

    </httpj:engine-factory>



    <jaxrs:server id="a-service" depends-on="kc-cxf-endpoint" address="
https://0.0.0.0:8282/cxf/a";>

        <jaxrs:serviceBeans>

            <ref bean="somebean-a"/>

        </jaxrs:serviceBeans>

        <jaxrs:providers>

            <bean class="com.fasterxml.jackson.jaxrs.json.
JacksonJsonProvider"/>

        </jaxrs:providers>

    </jaxrs:server>



This is the spring config I have in bundle 2 (much simpler. Just reuses the
same cxf context).



    <jaxrs:server id="b-service" address="https://0.0.0.0:8282/cxf/b";>

        <jaxrs:serviceBeans>

            <ref bean="somebean-b"/>

        </jaxrs:serviceBeans>

        <jaxrs:providers>

            <bean class="com.fasterxml.jackson.jaxrs.json.
JacksonJsonProvider"/>

        </jaxrs:providers>

        <jaxrs:features>

            <cxf:logging/>

        </jaxrs:features>

    </jaxrs:server>



Note that I’m using the same /cxf context in both servers but it doesn’t
make any difference - the problem still occurs even if they are totally
different root contexts.



Hopefully someone can suggest what I’m doing wrong?



Thanks



Andrew

Reply via email to