Thanks for the update for archival purposes.
Not having any real Mule experience, definitely not an area I would have been able to help too much with. :-( Dan On Tue October 13 2009 7:58:02 pm jackalista wrote: > Hi, > > I managed to resolve this, it turns out 3 things had to be changed: > > 1. Apparently the CXFServlet and the MuleRESTReceiverServlet don't play > nice together. I'm not shocked about this but I am disappointed; I wanted > to run services both from mule and from the web app but it looks like that > may not be possible. You must take the CXFServlet (or most likely the > XFire servlet too) out of your web.xml and remove the mapping and map the > mule receiver servlet to /services/*. > > 2. Similarly, thou shalt not declare any endpoints via CXF means (again, > likely also true of xfire), at least not via cxf-servlet.xml. I had this > declaration in cxf-servlet.xml but needed to comment it out, as CXF will > publish it even with the CXFServlet not in play: > > <!-- > <jaxws:endpoint > id="FooService" > implementor="#fooManager" > address="/FooService" > > </jaxws:endpoint> > --> > > 3. The above two were not shocking, I had doubts from the get-go about > running both CXF and mule servlets together in the same web app but this > last part surprised me. I had found an example on the mule site showing how > to change the databinding. The example shows an inbound-endpoint with CXF > prefix, instead of the prefix-less inbound-endpoint I found in the > bookstore example. It didn't seem like I could change the binding to aegis > without using the prefix but when I used the prefix I got a > MalformedEndpointException... but if I remove the cxf prefix (and also the > binding directive), it works fine... ?!?!? I haven't any deep detail on > that yet but I'll try to come back and update this to make it easier for > the next guy... the mule example webapp code is no where near as > functional nor as pretty as appfuse so I want to get this working to > facilitate building mule web apps. The problematic and working config for > the mule endpoint are here... > > This structure throws a MalformedEndpointException: > > <cxf:inbound-endpoint > address="cxf:http://0.0.0.0:8888/services/FooService"> <cxf:databinding> > <spring:bean class="org.apache.cxf.aegis.databinding.AegisDatabinding"/> > </cxf:databinding> > </cxf:inbound-endpoint> > > This structure does not throw any exceptions and the web app loads: > > <inbound-endpoint address="cxf:http://0.0.0.0:8888/services/FooService"/> > > > -=j=- > > jackalista wrote: > > It occurred to me that I might want to clarify what I'm asking, since > > it's a slightly complicated scenario. As my immediate exception is an > > aegis.DatabindingException, I was hoping somebody with good experience > > with CXF & aegis could look at my mapping file setup and / or > > annotations. Since they don't seem to be having any effect I suspect I'm > > doing something ignorant, as I am pretty inexperienced with CXF and > > Aegis. > > > > Also, I'm pretty green to this code, is it foolish to try to expose the > > same service via mule *and* the web app? They are exposed at different > > addresses, but it's the same code, the mule service definition refers to > > the same spring bean successfully exposed by CXF and the web app. Do > > implementation details preclude exposing this same service via mule at a > > different address? The web app is successfully publishing the service at > > /services/FooService, but the mule configuration at /mule/FooService is > > hitting the binding exception. If I make a request of a /mule/* URL the > > mule servlet gets invoked but can't find the endpoint, I think because it > > failed o get properly created due to the binding exception. > > > > My goal is to integrate mule into appfuse (and mule embeds cxf), but > > perhaps I'm taking a misstep in my pursuit of this. Should I perhaps > > suppress the web app's publication of services? I'm not seeing any > > conflict with ports or anything unless that's somehow involved with this > > binding exception but I'm new to both mule and CXF (I have more > > experience with appfuse and want to exploit it's web app capabilities and > > add mule in). It's a common scenario to load mule in web apps but most > > of the code on the mule site has very rudimentary web apps while appfuse > > has fairly high production values by comparison, I want to add mule to > > that rich environment. I am at liberty to share the code, there's not > > any "client" IP involved (hence the FooService), if anybody's interested, > > I can post it or send it to you. > > > > Thanks, > > > > --jack > > > > jackalista wrote: > >> Hi, > >> > >> I'm trying to integrate mule which uses CXF and Aegis under the hood > >> into a current appfuse dist and am running into a binding exception. > >> I've set the binding to use Aegis, and it looks like it's having trouble > >> with a service super class that features a method "getAll()" with a > >> parameterized List<T> return value where type variable T is set to a > >> domaon model class by the instantiating extending class. The method > >> signature is here: > >> > >> List<T> getAll(); > >> > >> At run time, extending class FooManagerImpl which implements interface > >> FooManager, is instantiated and it's inherited getAll() method sig looks > >> like this (Foo.java is the the hibernate persistent domain model class): > >> > >> List<Foo> getAll(); > >> > >> I've tried to use both the standard appfuse dist which includes xfire > >> and I also tried replacing xfire with CXF in appfuse but both suffer the > >> same Aegis binding exception about a failure to map the List return > >> value of getAll(). I'm taking this to mean that mule is using CXF / > >> Aegis > >> > >> I tried exposing the superclass getAll method directly in the subclass > >> interface and implementation and then put this annotation on it to try > >> to keep Aegis from trying to bind it but it had no effect. I followed > >> docs on annotations for this here: > >> > >> http://cwiki.apache.org/CXF20DOC/developing-a-service.html#DevelopingaSe > >>rvice-DevelopingaServiceusingJAXWS > >> > >> The annotation, which was apparently ignored, looks like this, but the > >> wsdl still showed the getAll() method: > >> > >> @WebMethod(exclude = true) > >> public List<Foo> getAll(); > >> > >> I also tried to use an Aegis XML mapping file which I placed in the jar > >> alonside the interface class [see attached screendump] is called > >> FooManager.aegis.xml [the class it is to map is the service interface > >> FooManager.class / FooManager.java, etc.]. The mapping class looks like > >> this: > >> > >> <mappings> > >> <mapping name="FooManager"> > >> <method name="getAll"> > >> <return-type name="foos" > >> componentType="org.jackalista.integration.model.Foo"/> > >> </method> > >> </mapping> > >> </mappings> > >> > >> Docs on using mapping files is here (for aegis 2.1, as I'm using CXF > >> 2.1.5), see the section on "Services and Parameters": > >> > >> http://cwiki.apache.org/CXF20DOC/aegis-21.html > >> > >> > >> It seems that both the exlude annotation and the aegis mapping file are > >> both being oignored but as I'm new to boeth CXF and Aegis, it may be due > >> to use error. In the version of appfuse in which I replaced xfire with > >> cxf, I used the version of cxf that the latest mule apparently uses > >> which is 2.1.5. The web app *is* able to expose the same annotated > >> service interface and class properly as a web service and publishes the > >> wsld at localhost:8080/services/FooService?wsdl as would be expected. > >> It looks like appfuse and mule each have their own instance of CXF but > >> I'm not sure about that. While the web app and its CXF properly publish > >> the web service, mule and the CXF it uses are hitting an exception > >> related to Aegis trying to map the getAll() method and failing. > >> > >> The exception being thrown is: > >> > >> Caused by: org.apache.cxf.aegis.DatabindingException: Error initializing > >> parameters for operation > >> {http://service.integration.jackalista.org/}getAll: Cannot create > >> mapping for java.util.List, unspecified component type for method getAll > >> parameter -1 > >> > >> > >> Can anybody point me in the right direction? It seems like the aegis > >> mapping code is having trouble with the parameterized List<T> getAll() > >> return value where T = Foo.java at run time. I uploaded a small zip > >> file of relevant files if that helps... > >> http://www.nabble.com/file/p25831156/jarfile.and.scrn.dump.zip > >> jarfile.and.scrn.dump.zip I suspect that I may be doing something naive > >> / stupid with the mapping file, the annotation or may perhaps be > >> approaching this incorrectly, any help would be greatly appreciated, > >> thanks. > >> > >> --jack > >> > >> > >> My mule config is loaded via the listener from web.xml, essentially I > >> too the bookstore demo code configuration and grafted it onto an appfuse > >> dist. Here's the service configuration for the service experiencing the > >> binding exception, FooService: > >> > >> > >> Fisrt I import my spring (2.5.6) applicationContext.xml with my service > >> interface & impl in it: > >> > >> <!-- import beans from appfuse applicationContext.xml --> > >> <spring:beans> > >> <spring:import resource="classpath:applicationContext.xml" /> > >> </spring:beans> > >> > >> Then, here's the service deinition > >> > >> <service name="FooService"> > >> <inbound> > >> <!-- Public interface --> > >> <cxf:inbound-endpoint address="cxf:http://0.0.0.0:8777/mule/foo"> > >> <cxf:databinding> > >> <spring:bean > >> class="org.apache.cxf.aegis.databinding.AegisDatabinding"/> > >> </cxf:databinding> > >> </cxf:inbound-endpoint> > >> > >> <!-- Administration interface --> > >> <inbound-endpoint address="servlet://foo"> > >> <transformers> > >> <!-- Convert request parameters to String object --> > >> <custom-transformer > >> class="org.jackalista.integration.service.transformers.HttpRequestToStri > >>ng"/> </transformers> > >> <response-transformers> > >> <!-- Format response to be a nice HTML page --> > >> <custom-transformer > >> class="org.jackalista.integration.service.transformers.AddFooListRespons > >>e"/> <!-- Force text/html, otherwise it falls back to request props, > >> which have form-encoded one --> > >> <transformer ref="setHtmlContentType"/> > >> </response-transformers> > >> </inbound-endpoint> > >> </inbound> > >> <pooled-component> > >> <!-- singleton-object > >> class="org.jackalista.integration.service.impl.FooManagerImpl" / --> > >> <spring-object bean="fooManager" /> > >> </pooled-component> > >> http://www.nabble.com/file/p25831156/aegis.binding.problem.zip > >> aegis.binding.problem.zip > -- Daniel Kulp [email protected] http://www.dankulp.com/blog
