首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2EE开发 >

java webservice 与数据库交互有关问题。

2012-01-29 
java webservice 与数据库交互问题。。急急急。。。首先我 写了一个操作数据库(我用的是mysql)的java类,里面有

java webservice 与数据库交互问题。。急急急。。。
首先我 写了一个操作数据库(我用的是mysql)的java类,里面有一些方法是直接返回一个结果集vector(比如:select * from goods_list),接着我使用axis 的java2wsdl将这个java类生成wsdl文件,然后用一个测试类根据wsdl文件来引用websevice,调用其中的返回结果集的方法,这时候问题就来了,数据库可以连接,但是就是不能返回结果集,取不到数据??我不知道为什么,请各位高手支支招!!!最好能以实例说明

[解决办法]
用wsdl生成axis的客户端,然后再调用webservice服务,看一下能不能返回结果。
如果不行,尝试将Vector修改为数组。
[解决办法]
因为你结果集是个List或者数组或者其他容器,axis2里面返回容器类或者数组的时候要将其封装成OMElement(XML格式)才能传递,你参考下下面的传递list的例子:

package aixs2listtest;

import java.util.*;
public class HelloBean {
private String name;
private int id;
private List<HelloBeanClass> helloBeanClasses;
public HelloBean(){}
public HelloBean(String name, int id ,List<HelloBeanClass> helloBeanClass){
this.name=name;
this.id=id;
this.helloBeanClasses=helloBeanClass;
}
public void setName(String name){
this.name=name;
}
public String getName(){
return this.name;
}
public void setId(int id){
this.id=id;
}
public int getId(){
return this.id;
}
public List<HelloBeanClass> getHelloBeanClass(){
return this.helloBeanClasses;
}
public void setHelloBeanClass(List<HelloBeanClass> helloBeanClass){
this.helloBeanClasses=helloBeanClass;
}

}





package aixs2listtest;

public class HelloBeanClass {
private int id;
private String className;

public HelloBeanClass(){}
public HelloBeanClass(int id, String className){
this.id=id;
this.className=className;
}
public void setId(int id){
this.id=id;
}
public int getId(){
return this.id;
}

public void setClassName(String className){
this.className=className;
}
public String getClassName(){
return this.className;
}

}






Java code
package aixs2listtest;
import java.util.*;

import org.apache.axiom.om.OMNode;
import org.apache.axiom.om.OMElement;
import org.apache.axis2.util.StreamWrapper;
import org.apache.axiom.om.impl.builder.StAXOMBuilder;
import org.apache.axiom.om.impl.llom.factory.OMXMLBuilderFactory;
import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axis2.databinding.utils.BeanUtil;
import javax.xml.namespace.QName;
public class HelloSource {
public OMElement echo(){
HelloBeanClass hbc1=new HelloBeanClass(11,"moonlight1");
HelloBeanClass hbc2=new HelloBeanClass(22,"moonlight2");
HelloBeanClass hbc3=new HelloBeanClass(33,"moonlight3");
List<HelloBeanClass> clss=new ArrayList<HelloBeanClass>();
clss.add(hbc1);clss.add(hbc2);clss.add(hbc3);
HelloBean hbs=new HelloBean("moon",1,clss);
HelloBean hbs2=new HelloBean("mo"+"\non2",2,clss);
HelloBean hbs3=new HelloBean("moon3",3,clss);
List<HelloBean> list = new ArrayList<HelloBean>();
list.add(hbs);
list.add(hbs2);
list.add(hbs3);
OMElement omElement = BeanUtil.getOMElement(new QName("HelloBeans"), list.toArray(), new QName("HelloBean"), false, null);

return omElement;
}
public static void main(String [] args){
HelloSource h=new HelloSource();
System.out.println("asd"+"\n"+"sdf");
h.echo();
}

}







package aixs2listtest;
import java.util.*;
import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
import org.apache.axiom.om.OMNode;
import org.apache.axis2.AxisFault;
import org.apache.axis2.Constants;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.client.ServiceClient;
import org.apache.axis2.databinding.utils.BeanUtil;
import org.apache.axis2.engine.DefaultObjectSupplier;

public class StubTest {

private static EndpointReference targetEPR = 
new EndpointReference("http://localhost:8080/axis2/services/HelloSource");

public static OMElement getPricePayload() {
OMFactory fac = OMAbstractFactory.getOMFactory();
OMNamespace omNs = fac.createOMNamespace("http://hello/xsd", "tns");

OMElement method = fac.createOMElement("echo", omNs);
return method;
}


public static void main(String[] args) {
try {
OMElement getPricePayload = getPricePayload();

Options options = new Options();
options.setTo(targetEPR);
options.setTransportInProtocol(Constants.TRANSPORT_HTTP);

ServiceClient sender = new ServiceClient();
sender.setOptions(options);

OMElement result = sender.sendReceive(getPricePayload);
System.err.println(getResults(result));

} catch (Exception e) {
e.printStackTrace();
}
}
private static List<HelloBean> getResults(OMElement element) throws AxisFault {
if (element == null) {
return null;
}
Iterator iterator = element.getChildElements();
List<HelloBean> list = new ArrayList<HelloBean>();
while (iterator.hasNext()) {
OMNode omNode = (OMNode) iterator.next();
if (omNode.getType() == OMNode.ELEMENT_NODE) {
OMElement omElement = (OMElement) omNode;
if (omElement.getLocalName().toLowerCase().equals("return")) {
HelloBean person = (HelloBean) BeanUtil.processObject(omElement,
HelloBean.class, null, true,
new DefaultObjectSupplier());
list.add(person);
}
}
}
return list;
}

}




services.xml 

XML code<service name="HelloSource" scope="application">
<description>
HelloSource
</description>
<messageReceivers>
<messageReceiver 
mep="http://www.w3.org/2004/08/wsdl/in-only"
class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/>
<messageReceiver
mep="http://www.w3.org/2004/08/wsdl/in-out"
class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
</messageReceivers>
<parameter name="ServiceClass">
aixs2listtest.HelloSource
</parameter>
</service>





以上文件编译后打成aar包的内容如下: 

HelloSource/aixs2listtest/*.java 
/META-INF/services.xml 


[解决办法]
public static void main(String[] args) { 
try { 
OMElement getPricePayload = getPricePayload(); 

Options options = new Options(); 


options.setTo(targetEPR); 
options.setTransportInProtocol(Constants.TRANSPORT_HTTP); 

ServiceClient sender = new ServiceClient(); 
sender.setOptions(options); 

OMElement result = sender.sendReceive(getPricePayload); 
System.err.println(getResults(result)); 

} catch (Exception e) { 
e.printStackTrace(); 


上面的result 就是从服务器端获得的xml格式的数据(也就是你要传输的对象) 
System.err.println(getResults(result)); 
这个你可以改成List <HelloBean> list=getResults(result); 
这样,对象就保存到了list里面
[解决办法]
webservice是通过网络进行序列化传递数据,而你的结果集是通过容器来存储的,是不能正常被序列化的。也就是说你的webservice不能将结果集中的容器正常转化成二进制数据,客户端调用webservice的时候也就不能正常接收和解释这部分二进制数据了。
[解决办法]
使用axis自带的序列化和反序列画化类,就可以了。不过我在想简单值对象需要这样做。那么Vector需要这样么?

[解决办法]
普通JavaBean(简单值对象)的序列化和反序列化
首先,在web service部署端,修改server- config.wsdd文件,在具体的service配置,增加如下代码:
< beanMapping languageSpecificType= "java:com.hnisi.axis.Book" qname= "ns1:Book" 
xmlns: ns1= "urn:BeanService" / > 
languageSpecificType属性指定JavaBean类文件位置,qname属性指定JavaBean类的名字。当然,一个service可以绑定多个bean对象。
*************
QName qn = new QName("urn:BeanService" ,"Book" ); 
call.registerTypeMapping(Book.class , qn,
new BeanSerializerFactory(Book.class , qn),
new BeanDeserializerFactory(Book.class , qn));


这个事一个简单类的反序列和序列化相关配置。其中BeanSerializerFactory就是axis自带的。我也这几天在学,我刚学会了简单值对象的传递。你的那个数组应该是不需要序列化的。 你邮箱给我。,我给你发一份资料。你看着尝试一下。

热点排行