Hi This is a good news... Here's some more information on how to apply this feature. I'll need to document it better - have added a task item...For, given the Catalog class mentioned in this thread the following model can be created :
<model> <resource name=" com.att.ecom.catalog.Catalog" path="/catalog"> <operation name="getItems" verb="GET" path="/items"/> </resource> </model> The schema for 'model' is here : http://svn.apache.org/repos/asf/cxf/trunk/rt/frontend/jaxrs/src/main/resources/schemas/jaxrs.xsd it is limiting a bit, specifically, parameter types should be capitalized at the moment and there's no a proper enum definition for parameter types. For ex, 'PATH', 'QUERY', 'MATRIX', 'HEADER' is what should be used when describing parameters that would otherwise be annotated with @PathParam, @QueryParam, @MatrixParam, @HeaderParam. There's no need to describe input parameters which are mapped to request bodies. Response parameters are not described too. 'resource' represents a resource class. It can describe either a root resource or a subresource one. For ex, if you have @Path("catalog") public class Catalog { @GET @Path("items") public List<Item> getItems() {...} @Path("items/{id}") public Item getItemName(@PathParam("id") Long id) {...} } where getItemName is a subresource locator and Item class has a method like public class Item { @GET public String getName() {...} } then, if we remove annotations, the same can be described like this : <model> <resource name=" com.att.ecom.catalog.Catalog" path="/catalog"> <operation name="getItems" verb="GET" path="/items"/> <operation name="getItemName" path="/item/{id}"> </operation> </operation> </resource> <resource name="com.att.ecom.catalog.Item"> <operation name="getName" verb="GET"/> </operation> </resource> </model> The resource with name "com.att.ecom.catalog.Item" is recognized as a subresource because when it introspects com.att.ecom.catalog.Catalog#getItemName it finds that its return type's name matches '"com.att.ecom.catalog.Item". So it's a flat structure but perhaps I'll support embedding resources too, similar to the way it's done in WADL. At the moment the only place where this feature is demoed is in a 'greeter_rest' demo in a DOSGi distribution[1] where IMHO this feature can be very handy indeed but I do want to allocate more time on it and document and enhance it properly. Sergey [1] http://svn.apache.org/repos/asf/cxf/dosgi/trunk/samples/greeter_rest/ KARR, DAVID (ATTCINW) wrote: > >> -----Original Message----- >> From: Sergey Beryozkin [mailto:[email protected]] >> Sent: Tuesday, August 25, 2009 1:02 PM >> To: [email protected] >> Subject: RE: getting "NO_RESOURCES_AVAILABLE" from >> "AbstractJAXRSFactoryBean.checkResources()" >> >> As the last resort/workaround, while you're investigating and just to >> keep >> you going, you might want to try this feature : >> http://cxf.apache.org/docs/jax-rs.html#JAX-RS- >> RESTfulserviceswithoutannotations >> >> You can describe how Catalog should be treated by the JAX-RS runtime >> without >> applying annotations and then register that description from spring > > I've gotten this to work (config in Spring, not annotations), so I'll at > least be able to move forward a bit. > >> KARR, DAVID (ATTCINW) wrote: >> > >> >> -----Original Message----- >> >> From: Sergey Beryozkin [mailto:[email protected]] >> >> Sent: Tuesday, August 25, 2009 10:06 AM >> >> To: [email protected] >> >> Subject: RE: getting "NO_RESOURCES_AVAILABLE" from >> >> "AbstractJAXRSFactoryBean.checkResources()" >> >> >> >> >> >> is it OSGi that is getting in the way ? Are you using OSGI by any >> >> chance ? >> >> That is the only reason I can think of... >> > >> > The prototype is embedded along with a lot of other code that is >> > assembled into an EAR with the ATG Dynamo framework. I'm pretty > sure >> > they're not using OSGi, but the EAR assembly is relatively complex. >> I'm >> > not sure what they could be doing that could possibly mess this up. >> > >> >> If yes then importing javax.ws.rs.* should fix it.... >> > >> > I assume you mean in the Catalog class? I'll try it. >> > >> >> Is it also possible for you to create a simple test project where >> you >> >> will >> >> load catalog class and try to get the @Path annotation on a >> >> Catalog.getItems() method, without even CXF being involved ? >> > >> > I'll put that on the list of things to try, but I would be extremely >> > surprised if that displayed any problem. It's likely something > about >> my >> > deployment environment that is causing this. >> > >> >> KARR, DAVID (ATTCINW) wrote: >> >> > >> >> >> -----Original Message----- >> >> >> From: Sergey Beryozkin [mailto:[email protected]] >> >> >> Sent: Tuesday, August 25, 2009 7:18 AM >> >> >> To: [email protected] >> >> >> Subject: RE: getting "NO_RESOURCES_AVAILABLE" from >> >> >> "AbstractJAXRSFactoryBean.checkResources()" >> >> >> >> >> >> >> >> >> Please add breakpoints to >> >> org.apache.cxf.jaxrs.JAXRSServerFactoryBean, >> >> >> its >> >> >> two setServiceBeans(...) methods. > JAXRSServerFactoryBean.create() >> > is >> >> >> called >> >> >> after one of those methods has been called. >> >> > >> >> > It hit "setServiceBeans(Object... beans)" with my one Catalog >> > object. >> >> > >> >> > In "getCreatedFromModel(Class<?> realClass)", I noted that >> >> > "classResourceInfos" was an empty list, so it returned null. > That >> >> could >> >> > be irrelevant. >> >> > >> >> > Then, in "evaluateResourceClass(ClassResourceInfo cri, boolean >> >> > enableStatic)", I saw that when it was processing the "getItem" >> >> method, >> >> > "AnnotationUtils.getHttpMethodValue(annotatedMethod)" returned >> null, >> >> so >> >> > it didn't create any class resource info. It also returned null >> > from >> >> > "AnnotationUtils.getMethodAnnotation(annotatedMethod, >> Path.class)". >> >> The >> >> > "getItem()" method has both the "@GET" and "@Path" annotation. >> >> > >> >> > Why doesn't it think there are any annotations? >> >> > >> >> >> KARR, DAVID (ATTCINW) wrote: >> >> >> > >> >> >> >> -----Original Message----- >> >> >> >> From: Sergey Beryozkin [mailto:[email protected]] >> >> >> >> Sent: Tuesday, August 25, 2009 3:54 AM >> >> >> >> To: [email protected] >> >> >> >> Subject: RE: getting "NO_RESOURCES_AVAILABLE" from >> >> >> >> "AbstractJAXRSFactoryBean.checkResources()" >> >> >> >> >> >> >> >> >> >> >> >> I've tried this class & beans.xml in the system tests area, >> >> Catalog >> >> >> >> class was >> >> >> >> recognized. >> >> >> >> >> >> >> >> Can you please let me know a bit more about the way you load >> the >> >> >> >> (catalog) >> >> >> >> application ? >> >> >> >> Are you using Maven or Ant ? Is it Jetty or Tomcat ? Or is it >> a >> >> >> >> standalone >> >> >> >> server which explicitly loads the beans.xml ? >> >> >> > >> >> >> > I build the application with Ant. It's deployed to WebLogic >> 10. >> >> >> > >> >> >> > Can you point me to some classes or methods that I could set >> >> >> breakpoints >> >> >> > in to try to diagnose why it's not processing the Catalog >> class? >> >> >> > >> >> >> >> >> >> >> >> thanks, Sergey >> >> >> >> >> >> >> >> >> >> >> >> KARR, DAVID (ATTCINW) wrote: >> >> >> >> > >> >> >> >> >> -----Original Message----- >> >> >> >> >> From: Sergey Beryozkin [mailto:[email protected]] >> >> >> >> >> Sent: Monday, August 24, 2009 1:13 PM >> >> >> >> >> To: [email protected] >> >> >> >> >> Subject: Re: getting "NO_RESOURCES_AVAILABLE" from >> >> >> >> >> "AbstractJAXRSFactoryBean.checkResources()" >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> Hi >> >> >> >> >> >> >> >> >> >> Everything seems to be ok. >> >> >> >> >> It appears the problem is to do with a missing import : >> >> >> >> >> >> >> >> >> >> <import resource="classpath:META-INF/cxf/cxf-extension- >> jaxrs- >> >> >> >> >> binding.xml" /> >> >> >> >> >> >> >> >> >> >> can you add it please to your beans.xml ? >> >> >> >> >> >> >> >> >> >> For some reasons Catalog class is not introspected. > Perhaps >> >> due >> >> >> to >> >> >> >> the >> >> >> >> >> fact >> >> >> >> >> the above import is missing and thus no jaxrs-aware spring >> >> >> factory >> >> >> >> is >> >> >> >> >> invoked >> >> >> >> > >> >> >> >> > Nope, I'm afraid that didn't help. >> >> >> >> > >> >> >> >> > The relevant jars I'm loading are: cxf-2.2.3.jar, jaxb-api- >> >> >> 2.1.jar, >> >> >> >> > jsr311-api-1.0.jar, spring.jar, and wsdl4j.jar >> >> >> >> > >> >> >> >> > My current XML and Java are this: >> >> >> >> > -----beans.xml------ >> >> >> >> > <?xml version="1.0" encoding="UTF-8"?> >> >> >> >> > <beans xmlns="http://www.springframework.org/schema/beans" >> >> >> >> > xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >> >> >> >> > xmlns:jaxws="http://cxf.apache.org/jaxws" >> >> >> >> > xmlns:jaxrs="http://cxf.apache.org/jaxrs" >> >> >> >> > xmlns:cxf="http://cxf.apache.org/core" >> >> >> >> > xsi:schemaLocation=" >> >> >> >> > http://www.springframework.org/schema/beans >> >> >> >> > > http://www.springframework.org/schema/beans/spring-beans.xsd >> >> >> >> > http://cxf.apache.org/jaxws >> >> >> http://cxf.apache.org/schemas/jaxws.xsd >> >> >> >> > http://cxf.apache.org/jaxrs >> >> >> http://cxf.apache.org/schemas/jaxrs.xsd >> >> >> >> > http://cxf.apache.org/core >> >> > http://cxf.apache.org/schemascore.xsd"> >> >> >> >> > >> >> >> >> > <import resource="classpath:META-INF/cxf/cxf.xml" /> >> >> >> >> > <import resource="classpath:META-INF/cxf/cxf-extension- >> >> soap.xml" >> >> >> >> > /> >> >> >> >> > <import >> > resource="classpath:META-INF/cxf/cxf-servlet.xml" >> >> /> >> >> >> >> > <import >> >> >> >> > resource="classpath:META-INF/cxf/cxf-extension-jaxrs- >> >> binding.xml" >> >> >> /> >> >> >> >> > >> >> >> >> > <jaxrs:server name="restcatalogserver" address="/rest"> >> >> >> >> > <jaxrs:features> >> >> >> >> > <cxf:logging/> >> >> >> >> > </jaxrs:features> >> >> >> >> > <jaxrs:serviceBeans> >> >> >> >> > <bean class="com.att.ecom.catalog.Catalog"/> >> >> >> >> > </jaxrs:serviceBeans> >> >> >> >> > </jaxrs:server> >> >> >> >> > </beans> >> >> >> >> > ------------------------- >> >> >> >> > -----Catalog.java----- >> >> >> >> > package com.att.ecom.catalog; >> >> >> >> > import java.util.ArrayList; >> >> >> >> > import java.util.List; >> >> >> >> > import javax.ws.rs.GET; >> >> >> >> > import javax.ws.rs.Path; >> >> >> >> > import javax.ws.rs.PathParam; >> >> >> >> > import javax.ws.rs.Produces; >> >> >> >> > import javax.xml.bind.annotation.XmlRootElement; >> >> >> >> > >> >> >> >> > @Path("/catalog/") >> >> >> >> > @Produces("application/xml") >> >> >> >> > public class Catalog { >> >> >> >> > @GET >> >> >> >> > @Path("/item/{id}") >> >> >> >> > public Item getItem(@PathParam("id") String id) { >> >> >> >> > Item item = new Item(); >> >> >> >> > item.setId(id); >> >> >> >> > item.setTitle("abc"); >> >> >> >> > item.setDescription("def"); >> >> >> >> > return new Item(); >> >> >> >> > } >> >> >> >> > @XmlRootElement(name = "Item") >> >> >> >> > public static class Item { >> >> >> >> > private String id; >> >> >> >> > private String title; >> >> >> >> > private String description; >> >> >> >> > >> >> >> >> > public String getTitle() { return title; } >> >> >> >> > public String getId() { return id; } >> >> >> >> > public String getDescription() { return >> > description; >> >> } >> >> >> >> > >> >> >> >> > public void setTitle(String title) { this.title >> > = >> >> title; >> >> >> >> > } >> >> >> >> > public void setId(String id) { this.id = id; } >> >> >> >> > public void setDescription(String description) { >> >> >> >> > this.description = description; } >> >> >> >> > } >> >> >> >> > } >> >> >> >> > -------------------- >> >> >> >> > >> >> >> >> >> KARR, DAVID (ATTCINW) wrote: >> >> >> >> >> > >> >> >> >> >> > I'm trying to set up a simple REST prototype running >> >> alongside >> >> >> >> some >> >> >> >> >> > other existing code. >> >> >> >> >> > >> >> >> >> >> > When I deploy, I appear to fall into the following "if" >> >> block >> >> >> in >> >> >> >> >> > "AbstractJAXRSFactoryBean.checkResources()": >> >> >> >> >> > >> >> >> >> >> > ----------------- >> >> >> >> >> > if (list.size() == 0) { >> >> >> >> >> > org.apache.cxf.common.i18n.Message msg = >> >> >> >> >> > new >> >> >> >> >> > >> > org.apache.cxf.common.i18n.Message("NO_RESOURCES_AVAILABLE", >> >> >> >> >> > >> >> > BUNDLE); >> >> >> >> >> > LOG.severe(msg.toString()); >> >> >> >> >> > throw new >> >> >> >> >> > WebApplicationException(Response.Status.NOT_FOUND); >> >> >> >> >> > } >> >> >> >> >> > --------------- >> >> >> >> >> > >> >> >> >> >> > This list would be empty if >> >> >> >> >> "serviceFactory.getRealClassResourceInfo()" >> >> >> >> >> > returned an empty list. What exactly would that >> indicate? >> >> >> >> >> > >> >> >> >> >> > My beans.xml is very simple right now, just: >> >> >> >> >> > ----------------------- >> >> >> >> >> > <?xml version="1.0" encoding="UTF-8"?> >> >> >> >> >> > <beans >> xmlns="http://www.springframework.org/schema/beans" >> >> >> >> >> > > xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >> >> >> >> >> > xmlns:jaxws="http://cxf.apache.org/jaxws" >> >> >> >> >> > xmlns:jaxrs="http://cxf.apache.org/jaxrs" >> >> >> >> >> > xsi:schemaLocation=" >> >> >> >> >> > http://www.springframework.org/schema/beans >> >> >> >> >> > >> > http://www.springframework.org/schema/beans/spring-beans.xsd >> >> >> >> >> > http://cxf.apache.org/jaxws >> >> >> >> http://cxf.apache.org/schemas/jaxws.xsd >> >> >> >> >> > http://cxf.apache.org/jaxrs >> >> >> >> > http://cxf.apache.org/schemas/jaxrs.xsd"> >> >> >> >> >> > >> >> >> >> >> > <import > resource="classpath:META-INF/cxf/cxf.xml" /> >> >> >> >> >> > <import resource="classpath:META-INF/cxf/cxf- >> extension- >> >> >> soap.xml" >> >> >> >> >> > /> >> >> >> >> >> > <import >> >> > resource="classpath:META-INF/cxf/cxf-servlet.xml" >> >> >> /> >> >> >> >> >> > >> >> >> >> >> > <jaxrs:server name="restcatalogserver" >> address="/rest"> >> >> >> >> >> > <jaxrs:serviceBeans> >> >> >> >> >> > <bean class="com.att.ecom.catalog.Catalog"/> >> >> >> >> >> > </jaxrs:serviceBeans> >> >> >> >> >> > </jaxrs:server> >> >> >> >> >> > </beans> >> >> >> >> >> > -------------------- >> >> >> >> >> > >> >> >> >> >> > The "Catalog" class is also very primitive so far: >> >> >> >> >> > -------------------------- >> >> >> >> >> > package com.att.ecom.catalog; >> >> >> >> >> > >> >> >> >> >> > import java.util.ArrayList; >> >> >> >> >> > import java.util.List; >> >> >> >> >> > >> >> >> >> >> > import javax.ws.rs.GET; >> >> >> >> >> > import javax.ws.rs.Path; >> >> >> >> >> > import javax.ws.rs.Produces; >> >> >> >> >> > >> >> >> >> >> > @Path("/catalog/") >> >> >> >> >> > @Produces("application/xml") >> >> >> >> >> > public class Catalog { >> >> >> >> >> > >> >> >> >> >> > @GET >> >> >> >> >> > @Path("/items") >> >> >> >> >> > public List<Item> getItems() { >> >> >> >> >> > ArrayList<Item> result = new >> >> >> ArrayList<Item>(); >> >> >> >> >> > result.add(new Item()); >> >> >> >> >> > return (result); >> >> >> >> >> > } >> >> >> >> >> > >> >> >> >> >> > public static class Item { >> >> >> >> >> > private String title; >> >> >> >> >> > private String description; >> >> >> >> >> > >> >> >> >> >> > public String getTitle() { return title; > } >> >> >> >> >> > public String getDescription() { return >> >> > description; >> >> >> } >> >> >> >> >> > >> >> >> >> >> > public void setTitle(String title) { > this.title >> >> > = >> >> >> title; >> >> >> >> >> > } >> >> >> >> >> > public void setDescription(String > description) >> { >> >> >> >> >> > this.description = description; } >> >> >> >> >> > } >> >> >> >> >> > } >> >> >> >> >> > ---------------------------- >> >> >> >> >> > >> >> >> >> >> > >> >> >> >> >> >> >> >> >> >> -- >> >> >> >> >> View this message in context: >> http://www.nabble.com/getting- >> >> >> >> >> %22NO_RESOURCES_AVAILABLE%22-from- >> >> >> >> >> %22AbstractJAXRSFactoryBean.checkResources%28%29%22- >> >> >> >> >> tp25120790p25123056.html >> >> >> >> >> Sent from the cxf-user mailing list archive at Nabble.com. >> >> >> >> > >> >> >> >> > >> >> >> >> > >> >> >> >> >> >> >> >> -- >> >> >> >> View this message in context: http://www.nabble.com/getting- >> >> >> >> %22NO_RESOURCES_AVAILABLE%22-from- >> >> >> >> %22AbstractJAXRSFactoryBean.checkResources%28%29%22- >> >> >> >> tp25120790p25132223.html >> >> >> >> Sent from the cxf-user mailing list archive at Nabble.com. >> >> >> > >> >> >> > >> >> >> > >> >> >> >> >> >> -- >> >> >> View this message in context: http://www.nabble.com/getting- >> >> >> %22NO_RESOURCES_AVAILABLE%22-from- >> >> >> %22AbstractJAXRSFactoryBean.checkResources%28%29%22- >> >> >> tp25120790p25135192.html >> >> >> Sent from the cxf-user mailing list archive at Nabble.com. >> >> > >> >> > >> >> > >> >> >> >> -- >> >> View this message in context: http://www.nabble.com/getting- >> >> %22NO_RESOURCES_AVAILABLE%22-from- >> >> %22AbstractJAXRSFactoryBean.checkResources%28%29%22- >> >> tp25120790p25138372.html >> >> Sent from the cxf-user mailing list archive at Nabble.com. >> > >> > >> > >> >> -- >> View this message in context: http://www.nabble.com/getting- >> %22NO_RESOURCES_AVAILABLE%22-from- >> %22AbstractJAXRSFactoryBean.checkResources%28%29%22- >> tp25120790p25141130.html >> Sent from the cxf-user mailing list archive at Nabble.com. > > > -- View this message in context: http://www.nabble.com/getting-%22NO_RESOURCES_AVAILABLE%22-from-%22AbstractJAXRSFactoryBean.checkResources%28%29%22-tp25120790p25149335.html Sent from the cxf-user mailing list archive at Nabble.com.
