Do not input private or sensitive data. View Qlik Privacy & Cookie Policy.
Skip to main content

Announcements
Qlik Open Lakehouse is Now Generally Available! Discover the key highlights and partner resources here.
cancel
Showing results for 
Search instead for 
Did you mean: 
Anonymous
Not applicable

Why doesn't this REST service work?

Trying to create a proof-of-concept REST service bundle.
It compiles fine.
Karaf starts the bundle with no errors.
But when I go the the URL where it should be, I get no response, and no errors in the log. Nothing.
here's the Interface:
@Path("greeter")
public interface Greeter {

@GET
@Path("greet/{name}")
@Produces(MediaType.TEXT_PLAIN)
public String greeter(@PathParam("name") String name);

}

The implementation:
public class GreeterImpl implements Greeter {

public String greeter(String name) {
return "hello "+name;
}

}

The bundle activator:
public class Activator implements BundleActivator {
private ServiceRegistration registration;
public void start(BundleContext bc) throws Exception {
Dictionary props = new Hashtable();
props.put("service.exported.interfaces", "*");
props.put("service.exported.configs", "org.apache.cxf.rs");
props.put("service.exported.intents", "HTTP");
props.put("org.apache.cxf.rs.address", "http://0.0.0.0:9118/");

registration = bc.registerService(Greeter.class.getName(), new GreeterImpl(), props);

System.out.println("CXF REST Test: http://0.0.0.0:9118/");
}
public void stop(BundleContext bc) throws Exception {
registration.unregister();
}

}

When I go to this URL:
http://localhost:9118/greeter/greet/miles
I get nothing. This is in Talend ESB 5.2.2. What am I doing wrong?
Labels (3)
3 Replies
Anonymous
Not applicable
Author

Hi - I think you are going the DOSGi path and we do not support it in ESB AFAIK.
Please have a look at /examples/cxf/jaxrs-intro/services, check how Blueprint context (in resources/OSGI_INF) can be used to activate an endpoint.
Anonymous
Not applicable
Author

Thank you for you help sberyozkin, yes, I was using a DOSGi example from the web.
Basically, I'm trying to build some services using JAX annotation and no configuration files, like I can do on TomEE.
So I looked up the example you mentioned and made these changes to my Greeter service:
1. Removed the Activator class.
2. copied the service.xml file from example to my src/main/java/resources/OSGI-INF/blueprint directory in my Maven project, with the changes below.
3. removed reference to bundle activator in my pom.xml file.
src/main/java/resources/OSGI-INF/blueprint/service.xml:
     <jaxrs:server id="greeterService" address="/cxf">
<jaxrs:serviceBeans>
<ref component-id="greeterBean" />
</jaxrs:serviceBeans>
</jaxrs:server>
<bean id="greeterBean" class="com.cn.dsa.greet.GreeterImpl"/>

The builds with no errors, and karaf launches it with no errors.
But again, there is no service at the URL.
I've tried:
http://localhost:8040/services/cxf/greeter/greet/miles
and
http://localhost:8040/cxf/greeter/greet/miles

If I go here:
http://localhost:8040/services/
it says "No services have been found" so are there a few more things I need to do?
Anonymous
Not applicable
Author

I have the service working now with blueprint.
The problem was that the @Path attribute value must start with a slash. That was it.
@Path("/greeter")
public interface Greeter {

@GET
@Path("greet/{name}")
@Produces(MediaType.TEXT_PLAIN)
public String greeter(@PathParam("name") String name);

}