Archive

Posts Tagged ‘JAX-WS’

Workaround for WAS NoClassDefFoundError with JAX-WS

If you have to use IBM’s JDK with WebSphere Application Server and like to unit test web services outside of the container, you may encounter:


java.lang.NoClassDefFoundError: com.ibm.ffdc.Manager
  at com.ibm.ws.ffdc.FFDCFilter.processException(FFDCFilter.java:82)
  at com.ibm.ws.webservices.engine.components.logger.LogFactory$2.run(LogFactory.java:159)
  at com.ibm.ws.security.util.AccessController.doPrivileged(AccessController.java:63)
  at com.ibm.ws.webservices.engine.components.logger.LogFactory.createLogFactory(LogFactory.java:141)
  at com.ibm.ws.webservices.engine.components.logger.LogFactory.(LogFactory.java:98)
  at java.lang.J9VMInternals.initializeImpl(Native Method)
  at java.lang.J9VMInternals.initialize(J9VMInternals.java:205)
  at com.ibm.ws.webservices.engine.soap.MessageFactoryImpl.(MessageFactoryImpl.java:103)

What is that? A quick search indicates that the server administration client jar is missing from the classpath, but why would I need that? I just want to publish a simple JAX-WS web service.

Fortunately there is a workaround. Set a system property:


  System.setProperty("javax.xml.soap.MetaFactory",
    "com.sun.xml.internal.messaging.saaj.soap.SAAJMetaFactoryImpl");

This forces the use of Sun’s web service stack and the problem is gone. When the code runs in the container the classes are available and in this way we can get the unit tests to work.

Advertisements
Categories: Java

Basic authentication with JAX-WS in Java SE

With JAX-WS web services it is common to use preemptive basic authentication. It is also common to test the services stand-alone using the built-in support in Java SE. Unfortunately that makes it hard to test the authentication and no principal will be available on the server side. What to do?

It turns out that it is fairly easy to enable authentication after all. I found this example from 2007. In short the endpoint is published using Sun’s built-in web server.

This publishes the web service ExampleWebService on a random port with a hard-coded user and password:


HttpServer webServer = HttpServer.create(new InetSocketAddress(0), 1);
webServer.start();
HttpContext context = webServer.createContext("/");
context.setAuthenticator(new BasicAuthenticator("ExampleRealm") {
  public boolean checkCredentials(String username, String password) {
    return "testuser".equals(username) && "testpassword".equals(password);
  }
});
Endpoint endpoint = Endpoint.create(new ExampleWebService());
endpoint.publish(context);

Don’t forget to stop the web server after the test. Sun’s web server may not always be available in production, but it is most likely there in the unit test environment.

Categories: Java