Currently, I see no usage instructions nor sample project that fully demonstrates usage of Caravan JAX-RS inside AEM (6.3). In trying to set it up, I have encountered numerous pitfalls (missing bundles, package conflicts, etc) that seem like they would warrant entries into the documentation.
The use case is publishing REST services from AEM. Basically, I am trying to get the following to work:
The Caravan-JaxRs-ApplicationPath bundle instruction is set to
What I am currently battling is that in AEM 6.3 SP1, the ServletContainerBridge's service(..) method is not even being called when I hit localhost:4502/services/test (confirmed to be the problem by debugging). I have verified that the service & servlet are registered (both via the services listing and the Http Whiteboard).
More notes:
I have tried to pull apart the caravan functionality, and move only a barebones set of modified classes from caravan into my bundle It is almost working, but I get an exception on the call of ServletContainerBridge.init(ServletConfig). I would be interested in knowing what the caravan does to not encounter this issue (if it does anything)
Obfuscated stack trace (removed client identifying text)
i've added a simple example application here:
https://github.com/wcm-io-caravan/caravan-jaxrs/tree/develop/examples/aem-caravan-jaxrs-sample
from the stacktrace - maybe you've missed to deploy the hibernate-validator bundle to you instances? see list of deployed dependencies in my example.
I dug down, and think I found the issue, but have no proposal for a resolution, yet. I'll try to explain the issue as best as I can.
In the bundle jersey-bean-validation-2.20.jar there is a java service listed in META-INF/services. The service interface is org.glassfish.jersey.internal.spi.ForcedAutoDiscoverable, which exposes the org.glassfish.jersey.server.validation.internal.ValidationAutoDiscoverable service implementation.
This service locator is preventing glassfish from finding/creating a Validator implementation, which causes the thrown exception when calling ServletContainer.init(ServletConfig) (that is largely a guess, I don't know Glassfish/javax.validation that well).
When you remove that service locator from that jar, then rewrap it all together, it starts working just fine. After some heavy debugging, I found that the exact spot it was throwing, and made an educated guess as to the cause. To help guide my testing, I compared what was in the service registry in http://central.maven.org/maven2/com/eclipsesource/jaxrs/jersey-min/2.22.2/ to what was in the nested jars in http://central.maven.org/maven2/io/wcm/osgi/wrapper/io.wcm.osgi.wrapper.jersey/2.20-0000/ .
This was the first difference between the two, with respect to service locator. This explains why the JAX-RS OSGi Connector works, when using its dependencies, while Caravan does not, when using the listed dependencies (aka, the two different Jersey combined jars).
Heh, we both posted within a minute of each other
I tried to add the dependencies, and it was still not working, but maybe I missed something. I'll take a look at your sample and try it out. I would much prefer to use the already available bundles, rather than having to generate & house one in the project.