Hi,
I am running some unit tests using local transport to see what happens when
an interceptor throws a Fault. I was expecting to get a Response back with
a status code of 500 but instead I get this:
javax.ws.rs.client.ClientException: java.lang.NullPointerException
> at
> org.apache.cxf.jaxrs.client.AbstractClient.setResponseBuilder(AbstractClient.java:374)
> at
> org.apache.cxf.jaxrs.client.WebClient.handleResponse(WebClient.java:1101)
> at
> org.apache.cxf.jaxrs.client.WebClient.doResponse(WebClient.java:1088)
> at
> org.apache.cxf.jaxrs.client.WebClient.doChainedInvocation(WebClient.java:1038)
> at org.apache.cxf.jaxrs.client.WebClient.doInvoke(WebClient.java:858)
> at org.apache.cxf.jaxrs.client.WebClient.doInvoke(WebClient.java:832)
> at org.apache.cxf.jaxrs.client.WebClient.invoke(WebClient.java:395)
> at org.apache.cxf.jaxrs.client.WebClient.get(WebClient.java:574)
>
My test setup is as follows:-
I declare a DummyInterceptor which throws a Fault..
public class DummyInterceptor extends AbstractPhaseInterceptor<Message> {
>
> public DummyInterceptor() {
> super(Phase.MARSHAL);
> }
>
> public void handleMessage(Message message) throws Fault {
> throw new Fault(new RuntimeException("hello from runtime
> exception"));
> }
> }
>
My test case configures local transport & registers the DummyInterceptor
@Before
> public void setup() {
> // enable local transport
> bus = BusFactory.newInstance().createBus();
> LocalTransportFactory localTransport = new LocalTransportFactory();
> DestinationFactoryManager dfm = bus
> .getExtension(DestinationFactoryManager.class);
> dfm.registerDestinationFactory("
> http://schemas.xmlsoap.org/soap/http",
> localTransport);
> dfm.registerDestinationFactory(
> "http://schemas.xmlsoap.org/wsdl/soap/http",
> localTransport);
> dfm.registerDestinationFactory(
> "http://cxf.apache.org/bindings/xformat", localTransport);
> dfm.registerDestinationFactory(
> "http://cxf.apache.org/transports/local", localTransport);
>
> ConduitInitiatorManager extension = bus
> .getExtension(ConduitInitiatorManager.class);
> extension.registerConduitInitiator(
> "http://cxf.apache.org/transports/local", localTransport);
> extension.registerConduitInitiator(
> "http://schemas.xmlsoap.org/wsdl/soap/http",
> localTransport);
> extension.registerConduitInitiator(
> "http://schemas.xmlsoap.org/soap/http", localTransport);
> extension.registerConduitInitiator(
> "http://cxf.apache.org/bindings/xformat", localTransport);
>
> // create a local endpoint
> sf = new JAXRSServerFactoryBean();
> sf.setBus(bus);
> sf.setAddress(LOCAL_ADDRESS);
> sf.setServiceBean(new SimpleRestServiceImpl());
> sf.setServiceClass(SimpleRestServiceImpl.class);
> }
>
> @After
> public void teardown() throws Exception {
> if (null != jaxrsServer) {
> // explicitly stop server
> jaxrsServer.destroy();
> }
> if (null != bus) {
> // shutdown the bus
> bus.shutdown(false);
> }
> }
>
> @Test
> public void
> testExceptionWhichOccursWithinAnOutboundFrameworkInterceptorReturnsAppropriateException()
> throws Exception {
>
> // register the DummyInterceptor which throws an exception
> List<Interceptor<? extends Message>> outInterceptors = new
> ArrayList<Interceptor<? extends Message>>(
> 1);
> outInterceptors.add(new DummyInterceptor());
>
> sf.setOutInterceptors(outInterceptors);
>
> // start the server
> jaxrsServer = sf.create();
>
> WebClient client = WebClient.create(LOCAL_ADDRESS);
> WebClient.getConfig(client).getRequestContext()
> .put(LocalConduit.DIRECT_DISPATCH, Boolean.TRUE);
>
> try {
> Response response = client
> .path("v1/greetings/aveeeeename")
> .type(MediaType.APPLICATION_JSON)
> .accept(MediaType.APPLICATION_JSON)
> .get(Response.class);
> assertEquals(500, response.getStatus());
> } finally {
> if (null != client) {
> client.close();
> }
> }
> }
>
I am using apache cxf version 2.7.4
Any help much appreciated
Thanks
Mandy