我不能返回数组的String []与JAX-WS [英] I can't return array String[] with JAX-WS

查看:230
本文介绍了我不能返回数组的String []与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 =htt​​p://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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆