Thanks a bunch.
One more question.. Is there a way to keep cookies automatically on a
session?
The remote end is sending a Set-Cookie: header on the first request,
but it doesn't get sent back in future requests.
I thought this was right from some googling, but it doesn't seem to
work..
((BindingProvider)client).getRequestContext().put
(BindingProvider.SESSION_MAINTAIN_PROPERTY, true);
--Joe
On Aug 31, 2007, at 2:17 PM, Daniel Kulp wrote:
Just FYI: I can reproduce this. I'm working on a fix now.
Dan
On Friday 31 August 2007, Joe Sunday wrote:
Actually, in the end, I did switch back to jaxb and option 2 to
change Foo to something else. The aegis binding was having some other
issues with multiple namespaces in the wsdl files it generated I need
to distill into a test case (It works with more or less the same
structure in XFire though)
I'm still having an issue with combining interfaces using CXF though
that's problematic on the client side.
If I do the CoreService, AppService, and PublicService as defined
below, XFire could take PublicService and a JDK proxy object and
construct all the correct methods. On the server, I can create an
abstract fake class and pass it as the implementorClass which seems
to work:
@WebService(endpointInterface="package.PublicService", ...)
public abstract class PublicServiceFake implements PublicService { }
On the client, if I try to create a client based on PublicService, it
finds and can invoke the methods on CoreService, but throws an error
it can't find information on methodOne when I try to invoke it.
(Sorry, don't have the stack trace in front of me right now.. I can
recreate it sometime later today) All the methods on all interfaces
are annotated with @WebMethod and @WebParam annotations.
If I do "AppService extends CoreService" and then configure an
AppService, I get the same result. If I then do "PublicService
extends AppService" (instead of "PublicService extends CoreService,
AppService), it works on the client but seems clunky that it can't
properly find all the WebMethod functions on the multiple direct
child interface case. In some cases, we have PublicService extending
3 or more child interfaces depending on the app, but it only finds
methods in the first child interface.
This is in both 2.0.1 and yesterday's 2.1 snapshot.
--Joe
On Aug 31, 2007, at 1:00 PM, Daniel Kulp wrote:
Other options would be:
1) add @WebMethod(name = "fooOperation") to the operation (to
generate the wrapper element with that name
2) change/remove the @XmlRootElement annotation in the "Foo" class
to make it not generate a Foo element. (may need to combine with
3)
3) add @WebResult annotation with a name set to "FooResult" or
something
to give it a unique name.
Dan
On Thursday 30 August 2007, Joe Sunday wrote:
As an update to this after spending some more time trying to unwind
it...
It appears the problem was actually due to a method in one of my
interfaces:
Foo foo(...)
JAXB would collide the Foo type and the foo method. Setting up an
Aegis binding instead seems to have cleared it up.
--Joe
On Aug 30, 2007, at 2:44 AM, Joe Sunday wrote:
I'm trying to migrate an existing framework from Xfire over to CXF
(2.0.1 and tonight's 2.1 snapshot), and I can't get it to play
nice.
There's a core framework that exports a web service interface of a
few methods. We have an additional application that builds on top
of that with it's own interface:
@WebService(...)
public interface CoreService {
@WebMethod(...)
Foo foo(...)
}
@WebService(...)
public interface AppService {
@WebMethod
ServiceResult methodOne(...)
@WebMethod
ServiceResult methodTwo(...)
}
Then we aggregate them together with a new interface that we
actually want exported:
@WebService(name = "MyService", targetNamespace =
"http://localhost/ Service")
public interface PublicService extends CoreService, AppService {
}
Actually implementing methodXXX is handled by a JDK proxy class
created by a factory in Spring that implements PublicService and
the InvocationHandler maps them back to the right implementation.
There is no actual Impl class to speak of.
If I setup my endpoint like this:
<jaxws:endpoint
id="helloWorld"
implementor="#publicServiceProxy"
address="/SnapManager" />
I get this during startup:
org.springframework.beans.factory.BeanCreationException: Error
creating bean with name 'helloWorld': Invocation of init method
failed; nested except
ion is java.lang.RuntimeException: Schema for namespace 'http://
localhost/Service' already contains type 'foo
Caused by:
java.lang.RuntimeException: Schema for namespace
'http://localhost/ Service' already contains type 'foo
at org.apache.ws.commons.schema.XmlSchema.addType
(XmlSchema.java:229)
at
org.apache.cxf.service.factory.ReflectionServiceFactoryBean.create
Wr ap pedMessageSchema(ReflectionServiceFactoryBean.java:660) at
org.apache.cxf.service.factory.ReflectionServiceFactoryBean.create
Wr ap pedSchema(ReflectionServiceFactoryBean.java:511)
at
org.apache.cxf.service.factory.ReflectionServiceFactoryBean.initia
li ze WrappedSchema(ReflectionServiceFactoryBean.java:430)
at
org.apache.cxf.service.factory.ReflectionServiceFactoryBean.buildS
er vi ceFromClass(ReflectionServiceFactoryBean.java:240)
at
org.apache.cxf.service.factory.ReflectionServiceFactoryBean.initia
li ze ServiceModel(ReflectionServiceFactoryBean.java:264)
at
org.apache.cxf.service.factory.ReflectionServiceFactoryBean.create
(ReflectionServiceFactoryBean.java:143)
at
org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean.create
(JaxWsServiceFactoryBean.java:89)
at
org.apache.cxf.frontend.AbstractEndpointFactory.createEndpoint
(AbstractEndpointFactory.java:82)
at org.apache.cxf.frontend.ServerFactoryBean.create
(ServerFactoryBean.java:107)
at org.apache.cxf.jaxws.JaxWsServerFactoryBean.create
(JaxWsServerFactoryBean.java:147)
at org.apache.cxf.jaxws.EndpointImpl.getServer
(EndpointImpl.java:287)
at org.apache.cxf.jaxws.EndpointImpl.doPublish
(EndpointImpl.java:227)
at org.apache.cxf.jaxws.EndpointImpl.publish
(EndpointImpl.java:179)
at org.apache.cxf.jaxws.EndpointImpl.publish
(EndpointImpl.java:340)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native
Method) at sun.reflect.NativeMethodAccessorImpl.invoke
(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke
(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
I tried giving it a class to find the annotations on as well
(though I didn't need this in XFire, it just read off the
Interface correctly):
@WebService(endpointInterface = "com.myapp.PublicService")
public abstract class PublicServiceFake implements PublicService {
}
and pointing the endpoint to it in Spring:
implementorClass="com.myapp.SnapManagerServiceFake"
with the same result. If I remove the "implements PublicService"
part, it'll startup, but then the generated wsdl doesn't actually
have any methods in it.
In XFire, my config looked like this (publicServiceProxy:
<bean name="xfire.annotationServiceFactory"
class="org.codehaus.xfire.annotations.AnnotationServiceFactory">
<constructor-arg index="0">
<bean
class="org.codehaus.xfire.annotations.jsr181.Jsr181WebAnnotations"
/> </constructor-arg>
<constructor-arg index="1" ref="xfire.transportManager" />
</bean>
<bean name="myService"
class="org.codehaus.xfire.spring.remoting.XFireExporter">
<property name="serviceBean" ref="publicServiceProxy" />
<property name="serviceInterface"
value="com.myapp.PublicService" />
<property name="serviceFactory"
ref="xfire.annotationServiceFactory"/>
<property name="xfire" ref="xfire"/>
<property name="properties"> <!-- This property is needed to
allow eclipse tools to properly validate the WSDL file -->
<map>
<entry>
<key>
<value>wsdlBuilder.generateImports</value>
</key>
<value>true</value>
</entry>
</map>
</property>
</bean>
--Joe
--
J. Daniel Kulp
Principal Engineer
IONA
P: 781-902-8727 C: 508-380-7194
[EMAIL PROTECTED]
http://www.dankulp.com/blog
--
J. Daniel Kulp
Principal Engineer
IONA
P: 781-902-8727 C: 508-380-7194
[EMAIL PROTECTED]
http://www.dankulp.com/blog