users@jersey.java.net

[WebDAV] How to register WebDAV with Jersey?

From: Markus KARG <markus.karg_at_gmx.net>
Date: Sat, 7 Feb 2009 22:37:08 +0100

Dear Jersey Community,

 

as some people had problems registering WebDAV Support for Jersey with the
Jersey Runtime, here is a short step-by-step solution, basing on the quite
popular TomCat product:

 

(1) Always use the latest WebDAV code.

 

WebDAV is under heavy construction, so you should use the latest bug fixes
always. The code is found in SVN trunk
(https://webdav.dev.java.net/source/browse/webdav/trunk/core/jaxrs) and can
be built using "mvn clean install". Certainly the resulting library must be
either installed in the lib-folder oder TomCat, or must be part of the
lib-folder of your .war file.

 

(2) Application class is obligatory.

 

Chapter 2.1 "Configuration" of the JAX-RS 1.0 specification says: "The
resources and providers that make up a JAX-RS application are configured via
an application-supplied subclass of Application.".

 

While this is not WebDAV specific so far, here comes the particular WebDAV
addition: You must implement the getSingletons method of your application in
a way that actively registers an instance of WebDavContextResolver, since
"WebDAV Support for JAX-RS" is implemented as a provider class in the sense
of the JAX-RS specification. Also, if you want to use custom extensions to
WebDAV, these must be registered in turn with the WebDavContextResolver so
"WebDAV Support for JAX-RS" will know how to handle them.

 

Example:

 

public Set<Object> getSingletons() {

  try {

    return new HashSet<Object>(Arrays.asList(new WebDavContextResolver(/*
custom extensions to be listed HERE */)));

  } catch (final JAXBException e) {

 
Logger.getLogger(AddressBookApplication.class.getName()).severe(e.toString()
);

    return null;

  }

}

 

(3) Publication of application is obligatory.

 

Chapter 2.3.2 "Servlet" of the JAX-RS 1.0 specification says: " When using a
non-JAX-RS aware servlet container, the servlet-class element of the web.xml
descriptor SHOULD name the JAX-RS implementation-supplied Servlet class. The
application-supplied subclass of Application is identified using an
init-param with a param-name of javax.ws.rs-.Application.".

 

Since this sample is using TomCat 6, and TomCat 6 is not JAX-RS-aware, we
have to do what the specification says.

 

Example:

 

<servlet>

  <servlet-name>ServletAdaptor</servlet-name>

  <!-- Tell Servlet-Container that we want to use JAX-RS -->

 
<servlet-class>com.sun.jersey.impl.container.servlet.ServletAdaptor</servlet
-class>

  <init-param>

    <param-name>javax.ws.rs.Application</param-name>

    <!-- Tell Servlet-Container that we want to use WebDAV -->

 
<param-value>net.java.dev.webdav.samples.jaxrs.addressbook.AddressBookApplic
ation</param-value>

  </init-param>

  <load-on-startup>1</load-on-startup>

</servlet>

 

That's it. This is the sole difference between Jersey in common, and Jersey
with WebDAV-Support. I hope you all now have more luck with your WebDAV
trials. :-)

 

Have Fun

Markus