我不能返回数组的String []与JAX-WS [英] I can't return array String[] with JAX-WS
问题描述
我有回报简单的String []在JAX-WS问题。
我有一个@WebMethod:
公共字符串[] getUserInfo(){
MessageContext的MC = wsContext.getMessageContext();
。HttpSession的会议=((javax.servlet.http.HttpServletRequest)mc.get(MessageContext.SERVLET_REQUEST))的getSession();
字符串username =(字符串)session.getAttribute(用户名);
的String [] =用户信息新的String [4];
会议hibSess = HibernateUtil.getSessionFactory()的openSession()。
hibSess.beginTransaction();
查询字符串=从用户的用户选择ID,登录,邮件,激活时user.login ='MRL';
查询QueryResult中= hibSess.createQuery(查询);
java.util.List的用户= queryResult.list();
INT I;
诠释J;
Object对象= NULL;
对于(i = 0; I< user.size();我++){
[对象] OBJ =(对象[])user.get(I)
为(J = 0; J< obj.length; J ++){
用户信息[J] = OBJ [J]的ToString();
}
}
/ *这里是那一刻,我检查服务器端阵列 - 它的优良* /
的System.out.println(美国:+ user.size()+,USERINFO长度+ userInfo.length +\\ n+用户信息[0]
+\\ n+用户信息[1] +\\ n+用户信息[2] +\\ n+用户信息[3]);
返回用户信息;
}
数组应具有四个元素。并在服务器上有四个要素,它们包含corract数据。
当我试图让我的客户在该阵列我没有得到任何错误。我刚刚得到一个单元素的数组里面是空的。
下面是客户端code:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(NAME =getUserInfo)
公共类GetUserInfo {
}@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(NAME =getUserInfoResponse,propOrder = {
_返回
})
公共类GetUserInfoResponse {
@XmlElement(NAME =回归)
受保护的String [] _return;公众的String [] getReturn(){
返回_return;
}公共无效setReturn(的String []值){
this._return =价值;
}}
和运行我使用客户端:
SimpleWebService代理=新SimpleWebServiceService()getSimpleWebServicePort()。
((BindingProvider)代理).getRequestContext()把(BindingProvider.SESSION_MAINTAIN_PROPERTY,真)。
proxy.connect();
的String [] = userArray proxy.getUserInfo();
服务器WSDL片段:
<消息名称=getUserInfo/>
<消息名称=getUserInfoResponse>
<部分的xmlns:NS2 =http://jaxb.dev.java.net/arrayNAME =回归TYPE =NS2:字符串数组/>
< /消息>
您可以使用列表
代替阵列,这是JAX-WS的默认值。
但是你可以使用自定义的 XmlAdapter
如果你真的坚持使用数组类型,一个类型JAX-WS能够理解和定制新的适应。
您需要注释:
@XmlElement(NAME =回归)
@XmlJavaTypeAdapter(StringArrayXmlAdapter.class)
受保护的String [] _return;
StringArrayXmlAdapter
进口的java.util.ArrayList;
进口java.util.Arrays中;
进口的java.util.List;进口javax.xml.bind.annotation.adapters.XmlAdapter;公共类StringArrayXmlTypeAdapter扩展
XmlAdapter<名单,LT;弦乐>中的String []> {
@覆盖
公开名单<串GT;元帅(字符串[] ARG)抛出异常{
返回新的ArrayList<串GT;(Arrays.asList(ARG));
} @覆盖
公众的String []解组(名单<串GT; ARG)抛出异常{
返回arg.toArray(新的String [] {});
}
}
我没有使用数组尝试一下,所以我不能保证是工程完全是这样的。
I have problem with return simple String[] in JAX-WS . I have an @WebMethod:
public String[] getUserInfo() {
MessageContext mc = wsContext.getMessageContext();
HttpSession session = ((javax.servlet.http.HttpServletRequest) mc.get(MessageContext.SERVLET_REQUEST)).getSession();
String username = (String) session.getAttribute("username");
String[] userInfo = new String[4];
Session hibSess = HibernateUtil.getSessionFactory().openSession();
hibSess.beginTransaction();
String query = "select id, login, email, active from User as user where user.login ='Mrl'";
Query queryResult = hibSess.createQuery(query);
java.util.List user = queryResult.list();
int i;
int j;
Object object = null;
for (i = 0; i < user.size(); i++) {
Object[] obj = (Object[]) user.get(i);
for (j = 0; j < obj.length; j++) {
userInfo[j] = obj[j].toString();
}
}
/* Here is the moment when I check the array on server side - it's fine */
System.out.println("US:"+user.size() + ", userInfo length" +userInfo.length+"\n"+userInfo[0]
+"\n"+userInfo[1]+"\n"+userInfo[2]+"\n"+userInfo[3]);
return userInfo;
}
The array should have four elements. And on server it has four elements, they contain corract data.
When I try to get that Array on my client I don't get any error. I just get an one-element array which is empty.
Here is the client code:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "getUserInfo")
public class GetUserInfo {
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "getUserInfoResponse", propOrder = {
"_return"
})
public class GetUserInfoResponse {
@XmlElement(name = "return")
protected String[] _return;
public String[] getReturn() {
return _return;
}
public void setReturn(String[] value) {
this._return = value;
}
}
And for running the client I use:
SimpleWebService proxy = new SimpleWebServiceService().getSimpleWebServicePort();
((BindingProvider)proxy).getRequestContext().put(BindingProvider.SESSION_MAINTAIN_PROPERTY,true);
proxy.connect();
String[] userArray = proxy.getUserInfo();
server wsdl fragment:
<message name="getUserInfo"/>
<message name="getUserInfoResponse">
<part xmlns:ns2="http://jaxb.dev.java.net/array" name="return" type="ns2:stringArray"/>
</message>
You could use List
instead of arrays, this is the default in jax-ws.
But you could use a custom XmlAdapter
if your really insist in using that array type, that adapts between a type jax-ws can understand and a custom new one.
You need to annotate:
@XmlElement(name = "return")
@XmlJavaTypeAdapter(StringArrayXmlAdapter.class)
protected String[] _return;
StringArrayXmlAdapter:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.xml.bind.annotation.adapters.XmlAdapter;
public class StringArrayXmlTypeAdapter extends
XmlAdapter<List<String>, String[]> {
@Override
public List<String> marshal(String[] arg) throws Exception {
return new ArrayList<String>(Arrays.asList(arg));
}
@Override
public String[] unmarshal(List<String> arg) throws Exception {
return arg.toArray(new String[] {});
}
}
I didn't try it with arrays, so i can't guarantee that is works exactly like this.
这篇关于我不能返回数组的String []与JAX-WS的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!