Hi Brad, Your stack trace suggests that an exception is thrown in EchoImpl.initialize() which calls
restServer.register(EchoService.class, this); and seems to be the problem here. Have you tried calling instead: restServer.register(EchoServiceImpl.class, this); soapServer.register(EchoServiceImpl.class, this); Not sure what RestServer and SoapServer are so a small example project might help here. Cheers, John. On Tue, Sep 6, 2016 at 5:07 PM, Brad Johnson <[email protected]> wrote: > Granted I'm new to Camel CDI but I'm a bit flummoxed by a problem that I > don't have a clue about. Any help is appreciated. > > When I start up CamelCDI test runner I get an error that an interface on > one of my classes doesn't have a valid constructor. Surprisingly when I run > the test I see the injection of the items into my test class (even though I > don't need them there it helps verify that they are getting constructed). > Below are the top of the test class, the Echo implementation and the Echo > interface. I'm bewildered why Weld would think it should be finding a > constructor in the interface. It smells a bit like test framework bug but > I'd only say that if I knew the stack better. > > The error is surprisingly from org.apache.cxf.service.factory but that > isn't what should be calling the initialize anyway. > > @RunWith(CamelCdiRunner.class) > public class RestTest { > > Logger logger = Logger.getLogger(RestTest.class); > @Inject > RestServer restServer; > @Inject > EchoService echoService; > @Before > public void init() > { > System.out.println("Rest Server: " + restServer); > System.out.println("Echo Service: " + echoService); > } > .... > > org.jboss.weld.exceptions.WeldException: WELD-000049: Unable to invoke > public void org.enjekt.osgi.echo.internal.impl.EchoImpl.initialize() on > org.enjekt.osgi.echo.internal.impl.EchoImpl@48e92c5c > Caused by: java.lang.reflect.InvocationTargetException > Caused by: org.apache.cxf.service.factory.ServiceConstructionException > Caused by: java.lang.RuntimeException: Resource class interface > org.enjekt.osgi.echo.api.EchoService has no valid constructor > > The impl class, shown below, has an initialize method on it to register > the interface on the injected servers. And that works. > > The println from the init method. > *Injected Rest Server in EchoImpl: > org.enjekt.osgi.microserver.internal.impl.RestServerImpl@5b7a7f33* > > Yes, this has both SCR and CDI annotations so that I can test with Camel > CDI which is very fast but deploy to karaf. The impl class looks like as > follows: > > public class EchoImpl implements EchoService{ > > @Reference > @Inject > SoapServer soapServer; > @Reference > @Inject > RestServer restServer; > public EchoImpl(){ > } > @PostConstruct > public void initialize(){ > System.out.println("Injected Rest Server: "+ restServer); > restServer.register(EchoService.class, this); > soapServer.register(EchoService.class, this); > > } > > The interface looks like the following: > > > /** > * The Interface EchoService is for testing deployment of a microservice > bundle. > */ > @WebService > @Path("/resources/echo") > @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) > @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) > public interface EchoService { > /** > * Echo a string back in either SOAP or REST > * > * @param echoString the echo string > * @return the string > */ > @GET > @Path("/{echoID}") > @WebMethod(operationName = "echoString") > public String echoString(@WebParam(name = "echoID", targetNamespace = "") > @PathParam("echoID") String echoString); > /** > * Echo object uses a message wrapper for request/responses in SOAP or REST. > * > * @param echoObject the echo object > * @return the echo response message > */ > @GET > @Path("/") > @WebMethod(operationName = "echoObject") > public EchoResponseMessage echoObject(@WebParam(name = "echoObject", > targetNamespace = "") @QueryParam("") EchoRequestMessage echoObject); > > } > > >
