Montag, 22. April 2013

REST-Web-Services mit JAX-RS portabel aktivieren

... und dennoch implementationsspezifisch konfigurieren? Eins nach dem anderen. Seit Java EE 6 kann man JAX-RS in einem Application-Server portabel dadurch aktivieren, dass man eine Klasse von javax.ws.rs.core.Application ableitet und mit @ApplicationPath annotiert:

package com.muchsoft.rest;

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

@ApplicationPath("/rest")
public class ApplicationWithRESTWebServices
                          extends Application {
}

D.h. dass man nun REST-Web-Services anbieten kann, ohne sich um die konkrete Implementierung – beispielsweise Jersey als Referenz-Implementation – kümmern zu müssen. Gut.

Was aber, wenn man doch gewisse produktspezifische Features nutzen möchte, wie beispielsweise ausführliches Trace-Logging bei Jersey? Dann greift man auf den Deployment-Deskriptor web.xml zurück und mappt dort ein Servlet mit den entsprechenden Init-Parametern. Allerdings muss das nicht eine Jersey-Klasse (mit entsprechendem servlet-mapping) sein, sondern es reicht, die eigene Application-Unterklasse als Servlet einzutragen (ohne servlet-mapping-Element):

<servlet>
  <servlet-name>
    com.muchsoft.rest.ApplicationWithRESTWebServices
  </servlet-name>
  <init-param>
    <param-name>
      com.sun.jersey.api.json.POJOMappingFeature
    </param-name>
    <param-value>true</param-value>
  </init-param>
  <init-param>
    <param-name>
      com.sun.jersey.config.feature.Trace
    </param-name>
    <param-value>true</param-value>
  </init-param>
</servlet>