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);
}