You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@cxf.apache.org by Chris Dunphy <ch...@sjrb.ca> on 2008/05/13 21:28:50 UTC
Using a JavaBean which contains a java.util.List property with CXF
JAX-WS/JAXB front-end
Hello,
I am trying to use this JavaBean object as a message that I am passing
by around by means of a web service:
*** MessageTO.java ***
public class MessageTO implements Serializable {
private String description;
private long id;
private List<String> stuff;
public List<String> getStuff() {
return stuff;
}
public void setStuff(List<String> stuff) {
this.stuff = stuff;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
}
*** end code sample ***
I am trying to do this with Apache CXF 2.1 with the JAX-WS/JAXB
implementation. I can get most of it to work with the dynamic client,
except for the List property "stuff", which doesn't work.
Here is some code that I wrote that prints a list of methods and their
parameters from the MessageTO bean class:
*** code sample from dynamic client ***
URL[] classURLS = { new URL("http://mymessagews/MessageReceiver") };
URLClassLoader classLoader = new URLClassLoader(classURLS);
DynamicClientFactory dcf = DynamicClientFactory.newInstance();
Client client =
dcf.createClient("http://localhost:9000/MessageReceiver?wsdl",
classLoader);
Object message =
Thread.currentThread().getContextClassLoader().loadClass("mymessagews.Me
ssageTO").newInstance();
Method[] methods = message.getClass().getMethods();
for (Method m : methods) {
System.out.print("[ Method name: " + m.getName());
Class[] params = m.getParameterTypes();
for (Class p : params) {
System.out.print("\n\tParam: " + p.getName());
}
System.out.print("\n\tReturn: " +
m.getReturnType().getName());
System.out.println(" ]");
}
*** end code sample ***
*** output of above codesnippet ***
[ Method name: getId
Return: long ]
[ Method name: setDescription
Param: java.lang.String
Return: void ]
[ Method name: setId
Param: long
Return: void ]
[ Method name: getDescription
Return: java.lang.String ]
[ Method name: getStuff
Return: java.util.List ]
[ Method name: wait
Return: void ]
[ Method name: wait
Param: long
Param: int
Return: void ]
[ Method name: wait
Param: long
Return: void ]
[ Method name: hashCode
Return: int ]
[ Method name: getClass
Return: java.lang.Class ]
[ Method name: equals
Param: java.lang.Object
Return: boolean ]
[ Method name: toString
Return: java.lang.String ]
[ Method name: notify
Return: void ]
[ Method name: notifyAll
Return: void ]
*** end output ***
The getter seems to be there, but the setter is not. Is there any kind
of annotation that I can use to get java.util.List to work, so that I
can call the setStuff(List<String> stuff) method with the dynamic JAX-WS
client?
Sadly, aegis is not an option because I can't get that to work with the
dynamic client. I have poured over as much documentation as I could
find, but I couldn't seem to find a way to get this working.
Thanks!
Chris Dunphy
Software Developer, Enterprise Software Development
Shaw Cablesystems G.P. 750-7417 chris.dunphy@sjrb.ca
Suite 800 630 3rd Avenue SW, Calgary, Alberta, T2P 4L4
try {
succeed();
} catch (const failed_error& e) {
try {
try_again();
}
}
RE: Using a JavaBean which contains a java.util.List property with CXF
JAX-WS/JAXB front-end
Posted by Chris Dunphy <ch...@sjrb.ca>.
Thanks for the quick reply!
That worked perfectly...
Thanks again,
// Chris Dunphy
-----Original Message-----
From: Daniel Kulp [mailto:dkulp@apache.org]
Sent: Tuesday, May 13, 2008 1:38 PM
To: users@cxf.apache.org
Subject: Re: Using a JavaBean which contains a java.util.List property
with CXF JAX-WS/JAXB front-end
For Lists, per JAXB spec, only a setter is generated and it
manipulates the live "list" that is stored in the object. In your
case, it would be something like:
public class MessageTO implements Serializable {
....
private List<String> stuff = new ArrayList<String>();
public List<String> getStuff() {
return stuff;
}
....
}
and you would populate it with something like:
msg.getStuff().addAll(myData);
That's what the spec calls for. Note: getStuff() always returns a non-
null list. The stuff field always has a value.
Dan
On May 13, 2008, at 3:28 PM, Chris Dunphy wrote:
> Hello,
>
> I am trying to use this JavaBean object as a message that I am passing
> by around by means of a web service:
>
> *** MessageTO.java ***
>
> public class MessageTO implements Serializable {
>
> private String description;
> private long id;
> private List<String> stuff;
>
> public List<String> getStuff() {
> return stuff;
> }
>
> public void setStuff(List<String> stuff) {
> this.stuff = stuff;
> }
>
> public String getDescription() {
> return description;
> }
>
> public void setDescription(String description) {
> this.description = description;
> }
>
> public long getId() {
> return id;
> }
>
> public void setId(long id) {
> this.id = id;
> }
> }
>
> *** end code sample ***
>
>
> I am trying to do this with Apache CXF 2.1 with the JAX-WS/JAXB
> implementation. I can get most of it to work with the dynamic client,
> except for the List property "stuff", which doesn't work.
>
> Here is some code that I wrote that prints a list of methods and their
> parameters from the MessageTO bean class:
>
> *** code sample from dynamic client ***
>
> URL[] classURLS = { new URL("http://mymessagews/MessageReceiver") };
> URLClassLoader classLoader = new URLClassLoader(classURLS);
> DynamicClientFactory dcf = DynamicClientFactory.newInstance();
> Client client =
> dcf.createClient("http://localhost:9000/MessageReceiver?wsdl",
> classLoader);
>
> Object message =
> Thread
> .currentThread().getContextClassLoader().loadClass("mymessagews.Me
> ssageTO").newInstance();
>
> Method[] methods = message.getClass().getMethods();
> for (Method m : methods) {
> System.out.print("[ Method name: " + m.getName());
> Class[] params = m.getParameterTypes();
> for (Class p : params) {
> System.out.print("\n\tParam: " + p.getName());
> }
> System.out.print("\n\tReturn: " +
> m.getReturnType().getName());
> System.out.println(" ]");
> }
>
> *** end code sample ***
>
>
>
> *** output of above codesnippet ***
>
> [ Method name: getId
> Return: long ]
> [ Method name: setDescription
> Param: java.lang.String
> Return: void ]
> [ Method name: setId
> Param: long
> Return: void ]
> [ Method name: getDescription
> Return: java.lang.String ]
> [ Method name: getStuff
> Return: java.util.List ]
> [ Method name: wait
> Return: void ]
> [ Method name: wait
> Param: long
> Param: int
> Return: void ]
> [ Method name: wait
> Param: long
> Return: void ]
> [ Method name: hashCode
> Return: int ]
> [ Method name: getClass
> Return: java.lang.Class ]
> [ Method name: equals
> Param: java.lang.Object
> Return: boolean ]
> [ Method name: toString
> Return: java.lang.String ]
> [ Method name: notify
> Return: void ]
> [ Method name: notifyAll
> Return: void ]
>
> *** end output ***
>
> The getter seems to be there, but the setter is not. Is there any kind
> of annotation that I can use to get java.util.List to work, so that I
> can call the setStuff(List<String> stuff) method with the dynamic
> JAX-WS
> client?
>
> Sadly, aegis is not an option because I can't get that to work with
> the
> dynamic client. I have poured over as much documentation as I could
> find, but I couldn't seem to find a way to get this working.
>
>
> Thanks!
>
>
> Chris Dunphy
> Software Developer, Enterprise Software Development
> Shaw Cablesystems G.P. 750-7417 chris.dunphy@sjrb.ca
> Suite 800 630 3rd Avenue SW, Calgary, Alberta, T2P 4L4
>
> try {
> succeed();
> } catch (const failed_error& e) {
> try {
> try_again();
> }
> }
>
>
---
Daniel Kulp
dkulp@apache.org
http://www.dankulp.com/blog
Re: Using a JavaBean which contains a java.util.List property with CXF JAX-WS/JAXB front-end
Posted by Daniel Kulp <dk...@apache.org>.
For Lists, per JAXB spec, only a setter is generated and it
manipulates the live "list" that is stored in the object. In your
case, it would be something like:
public class MessageTO implements Serializable {
....
private List<String> stuff = new ArrayList<String>();
public List<String> getStuff() {
return stuff;
}
....
}
and you would populate it with something like:
msg.getStuff().addAll(myData);
That's what the spec calls for. Note: getStuff() always returns a non-
null list. The stuff field always has a value.
Dan
On May 13, 2008, at 3:28 PM, Chris Dunphy wrote:
> Hello,
>
> I am trying to use this JavaBean object as a message that I am passing
> by around by means of a web service:
>
> *** MessageTO.java ***
>
> public class MessageTO implements Serializable {
>
> private String description;
> private long id;
> private List<String> stuff;
>
> public List<String> getStuff() {
> return stuff;
> }
>
> public void setStuff(List<String> stuff) {
> this.stuff = stuff;
> }
>
> public String getDescription() {
> return description;
> }
>
> public void setDescription(String description) {
> this.description = description;
> }
>
> public long getId() {
> return id;
> }
>
> public void setId(long id) {
> this.id = id;
> }
> }
>
> *** end code sample ***
>
>
> I am trying to do this with Apache CXF 2.1 with the JAX-WS/JAXB
> implementation. I can get most of it to work with the dynamic client,
> except for the List property "stuff", which doesn't work.
>
> Here is some code that I wrote that prints a list of methods and their
> parameters from the MessageTO bean class:
>
> *** code sample from dynamic client ***
>
> URL[] classURLS = { new URL("http://mymessagews/MessageReceiver") };
> URLClassLoader classLoader = new URLClassLoader(classURLS);
> DynamicClientFactory dcf = DynamicClientFactory.newInstance();
> Client client =
> dcf.createClient("http://localhost:9000/MessageReceiver?wsdl",
> classLoader);
>
> Object message =
> Thread
> .currentThread().getContextClassLoader().loadClass("mymessagews.Me
> ssageTO").newInstance();
>
> Method[] methods = message.getClass().getMethods();
> for (Method m : methods) {
> System.out.print("[ Method name: " + m.getName());
> Class[] params = m.getParameterTypes();
> for (Class p : params) {
> System.out.print("\n\tParam: " + p.getName());
> }
> System.out.print("\n\tReturn: " +
> m.getReturnType().getName());
> System.out.println(" ]");
> }
>
> *** end code sample ***
>
>
>
> *** output of above codesnippet ***
>
> [ Method name: getId
> Return: long ]
> [ Method name: setDescription
> Param: java.lang.String
> Return: void ]
> [ Method name: setId
> Param: long
> Return: void ]
> [ Method name: getDescription
> Return: java.lang.String ]
> [ Method name: getStuff
> Return: java.util.List ]
> [ Method name: wait
> Return: void ]
> [ Method name: wait
> Param: long
> Param: int
> Return: void ]
> [ Method name: wait
> Param: long
> Return: void ]
> [ Method name: hashCode
> Return: int ]
> [ Method name: getClass
> Return: java.lang.Class ]
> [ Method name: equals
> Param: java.lang.Object
> Return: boolean ]
> [ Method name: toString
> Return: java.lang.String ]
> [ Method name: notify
> Return: void ]
> [ Method name: notifyAll
> Return: void ]
>
> *** end output ***
>
> The getter seems to be there, but the setter is not. Is there any kind
> of annotation that I can use to get java.util.List to work, so that I
> can call the setStuff(List<String> stuff) method with the dynamic
> JAX-WS
> client?
>
> Sadly, aegis is not an option because I can't get that to work with
> the
> dynamic client. I have poured over as much documentation as I could
> find, but I couldn't seem to find a way to get this working.
>
>
> Thanks!
>
>
> Chris Dunphy
> Software Developer, Enterprise Software Development
> Shaw Cablesystems G.P. 750-7417 chris.dunphy@sjrb.ca
> Suite 800 630 3rd Avenue SW, Calgary, Alberta, T2P 4L4
>
> try {
> succeed();
> } catch (const failed_error& e) {
> try {
> try_again();
> }
> }
>
>
---
Daniel Kulp
dkulp@apache.org
http://www.dankulp.com/blog