Is your service defined as a request-response service or a oneway service? >From the method signature, it looks like a oneway service.
For a oneway service, there is no fault processing triggered if the fault occurs after some point in the processing phase (in precisely speaking, after the pre_logical phase). That means, there is no fault message returned to the client. We have recently added an option to return a fault in such cases (in 2.5.3-snapshot, 2.4.7-snapshot). regards, aki 2012/2/7 Stephane Eybert <[email protected]>: > Hello, > > I have an exception interceptor but it doesn't feel like it's being called. > > I have a web service throwing a business exception: > > public class BusinessException extends Exception { > > private static final long serialVersionUID = -5864470001914577094L; > > } > > The unit test catches the business exception just fine and the test passes: > > @Test > public void testMakeBusinessException() { > try { > helloService.makeBusinessException(); > } catch (BusinessException e) { > logger.debug("==============>>> Business exception: " > + e.getMessage() + > " " + e.getCause()); > return; > } > fail("The expected business exception was not thrown."); > } > > I also have set up an interceptor: > > @NoJSR250Annotations > public class ExceptionInterceptor extends AbstractSoapInterceptor { > > private Logger logger = > LoggerFactory.getLogger(ExceptionInterceptor.class); > > public ExceptionInterceptor() { > super(Phase.PRE_LOGICAL); > logger.error("=================>>> Calling the constructor of > ExceptionInterceptor."); > } > > public void handleMessage(SoapMessage message) throws Fault { > Fault fault = (Fault) message.getContent(Exception.class); > Throwable ex = fault.getCause(); > logger.error("=================>>> A soap fault has been > caught."); > if (ex instanceof BusinessException) { > BusinessException e = (BusinessException) ex; > logger.debug("=================>>> Generating a soap > fault with a > business exception."); > generateSoapFault(fault, e); > } else { > logger.debug("=================>>> Generating a soap > fault with an > exception that is not a business one."); > generateSoapFault(fault, null); > } > } > > private void generateSoapFault(Fault fault, Exception e) { > int dummy_error_code = 1234; > fault.setFaultCode(createQName(dummy_error_code)); > fault.setMessage("A business exception occured and the error > code was " + > dummy_error_code); > } > > private static QName createQName(int errorCode) { > return new QName("http://cxf.nki.no", > String.valueOf(errorCode)); > } > > } > > With the following Spring configuration: > > <cxf:outFaultInterceptors> > <ref bean="exceptionInterceptor" /> > </cxf:outFaultInterceptors> > > <bean id="exceptionInterceptor" > class="no.nki.springws.server.interceptor.ExceptionInterceptor"> > </bean> > > The Maven build is successful. > > But I can see none of the logger.debug() statements output in the console. > > The only logger.debug() statements I see in the console are these two: > > This one: > > @Override > public void makeBusinessException() throws BusinessException { > logger.debug("===================>>> Making a business > exception."); > throw new BusinessException(); > } > > And this one from the test above: > logger.debug("==============>>> Business exception: " + e.getMessage() + " " > + e.getCause()); > > And here is the console output: > > 2012-02-07 20:02:15,371 DEBUG [DependencyInjectionTestExecutionListener] > Performing dependency injection for test context [[TestContext@88e2dd > testClass = HelloServiceTest, testInstance = > no.nki.springws.server.service.HelloServiceTest@152643, testMethod = [null], > testException = [null], mergedContextConfiguration = > [MergedContextConfiguration@203c31 testClass = HelloServiceTest, locations = > '{classpath:spring-services.xml, classpath:spring-cxf.xml, > classpath:spring-jaxws-endpoints.xml, classpath:log4j.xml}', classes = '{}', > activeProfiles = '{}', contextLoader = > 'org.springframework.test.context.support.DelegatingSmartContextLoader']]]. > 2012-02-07 20:02:15,372 DEBUG [TestContext] Retrieved ApplicationContext > for test class [class no.nki.springws.server.service.HelloServiceTest] from > cache with key [[MergedContextConfiguration@203c31 testClass = > HelloServiceTest, locations = '{classpath:spring-services.xml, > classpath:spring-cxf.xml, classpath:spring-jaxws-endpoints.xml, > classpath:log4j.xml}', classes = '{}', activeProfiles = '{}', contextLoader > = 'org.springframework.test.context.support.DelegatingSmartContextLoader']]. > 2012-02-07 20:02:15,372 DEBUG [InjectionMetadata] Processing injected > method of bean 'no.nki.springws.server.service.HelloServiceTest': > AutowiredFieldElement for private > no.nki.springws.server.service.HelloService > no.nki.springws.server.service.HelloServiceTest.helloService > 2012-02-07 20:02:15,372 DEBUG [DefaultListableBeanFactory] Returning cached > instance of singleton bean 'helloService' > 2012-02-07 20:02:15,372 DEBUG [HelloServiceImpl] ===================>>> > Making a business exception. > 2012-02-07 20:02:15,372 DEBUG [HelloServiceTest] ==============>>> Business > exception: null null > 2012-02-07 20:02:15,373 DEBUG [DirtiesContextTestExecutionListener] After > test method: context [[TestContext@88e2dd testClass = HelloServiceTest, > testInstance = no.nki.springws.server.service.HelloServiceTest@152643, > testMethod = testMakeBusinessException@HelloServiceTest, testException = > [null], mergedContextConfiguration = [MergedContextConfiguration@203c31 > testClass = HelloServiceTest, locations = '{classpath:spring-services.xml, > classpath:spring-cxf.xml, classpath:spring-jaxws-endpoints.xml, > classpath:log4j.xml}', classes = '{}', activeProfiles = '{}', contextLoader > = > 'org.springframework.test.context.support.DelegatingSmartContextLoader']]], > class dirties context [false], class mode [null], method dirties context > [false]. > 2012-02-07 20:02:15,373 DEBUG [DirtiesContextTestExecutionListener] After > test class: context [[TestContext@88e2dd testClass = HelloServiceTest, > testInstance = [null], testMethod = [null], testException = [null], > mergedContextConfiguration = [MergedContextConfiguration@203c31 testClass = > HelloServiceTest, locations = '{classpath:spring-services.xml, > classpath:spring-cxf.xml, classpath:spring-jaxws-endpoints.xml, > classpath:log4j.xml}', classes = '{}', activeProfiles = '{}', contextLoader > = > 'org.springframework.test.context.support.DelegatingSmartContextLoader']]], > dirtiesContext [false]. > Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.171 sec > > Any clue ? > > Thanks > > Stephane > > > -- > View this message in context: > http://cxf.547215.n5.nabble.com/Why-is-my-exception-interceptor-not-being-called-tp5464238p5464238.html > Sent from the cxf-user mailing list archive at Nabble.com.
