Hi Marko
On 02/04/12 17:19, Voß, Marko wrote:
Hello Sergey,

thanks again!

welcome
I figured out I could simply use the UriBuilder for this:

UriBuilder uriBuilder = UriBuilder.fromResource(MyJaxRsInterface.class);
URI uri = uriBuilder.path(MyJaxRsInterface.class, "retrieve").build("foo-id");
LOG.warn("PATH: " + jaxrsServerFactoryBean.getAddress() + '/' + uri.toString());

When distributing services in a cluster for example, we expect the jaxrs:server 
address to be equal on all machines.

So this should do the trick too. Especially, when MyJaxRsInterface-service is 
not available on the server, which
requires to know the endpoints to put them into the delivered resources for 
example. :)
So UriInfo won't help in your case ?

Cheers, Sergey


Best regards,

Marko

Am 02.04.2012 15:53, schrieb Sergey Beryozkin:
Hi Marko
On 02/04/12 15:34, Voß, Marko wrote:
Hello,

I need to know the existing endpoints of a JAX-RS interface.


The services page should return the list of all the REST (&  WS) endpoints 
available and then individual WADL instances
will describe all the root resources which constitute a given endpoint,

I did the following solution first:

List<ClassResourceInfo>  resources = 
jaxrsServerFactoryBean.getServiceFactory().getClassResourceInfo();
for (ClassResourceInfo resource : resources) {
if (FooRestService.class.isAssignableFrom(resource.getServiceClass())) {
LOG.warn("Foo REST-Service locally available!");
LOG.warn("Service path: " + resource.getPath().value());
for (OperationResourceInfo ori : 
resource.getMethodDispatcher().getOperationResourceInfos()) {
if (ori.getAnnotatedMethod().getName().equals("retrieve")) {
LOG.warn("Method path: " + 
ori.getAnnotatedMethod().getAnnotation(Path.class).value());
}
}
}
}

Output:

Foo REST-Service locally available!
Service path: /foo/something
Method path: /{id}


This solution however may not work, when dealing with distributed services. One 
server instance may not have all
services registered to its jaxrs:server bean configured in Spring.

What we do have available on all instances are the JAX-RS interfaces because of 
we need to perform requests to the other
instances of course.

So, is there an easy way to get all the endpoints or do I have to implement the 
reflection on my own?

I do know, that CXF is already handling this in some classes. I tried the 
following, which does not work, because the
iteration has no items to iterate through. I would prefer to reuse the existing 
code in CXF for this.

JAXRSServiceFactoryBean serviceFactoryBean = new JAXRSServiceFactoryBean();
serviceFactoryBean.setResourceClass(FooRestServiceImpl.class);
Service service = serviceFactoryBean.create();
for (Endpoint endpoint : service.getEndpoints().values()) {
LOG.warn("Endpoints: " + endpoint.getEndpointInfo());
}

Output:

<nothing>
Right now the model representing JAX-RS endpoints and the CXF model which is 
optimized for representing WS service and
endpoints are not closely related, there's a link but it's not a 1 to 1 match,
the following will only give you the list of all the root resource for a 
current endpoint.

Service service = serverFactoryBean.getServiceFactory().getService();
List<ClassResourceInfo>  list = 
((JAXRSServiceImpl)service).getClassResourceInfos();

They can also be retrieved at runtime from the current message:

Service service = message.getExchange().get(Service.class);
List<ClassResourceInfo>  resources = 
((JAXRSServiceImpl)service).getClassResourceInfos();

In order to get the list if all the jaxrs endpoints you'd need to get
a DestinationRegistryManager extension from the bus and enumerate over all the 
destinations and those which return
null for getEndpointInfo().getInterface() do represent restful endpoints :-) so 
if possible try the services page for
the latter task :-)

Sergey







Reply via email to