M
MC
i just wrote a webservice using the axis2-framework .. the service can
be found here:
---------------------------------------------------
package de.testService;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Vector;
public class TestService {
public Connection con = null;
TransportContainer tc = new TransportContainer();
Vector v = new Vector();
public final void connection() throws Exception {
Class.forName("com.mysql.jdbc.Driver");
con = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/travelagent", "root", "");
}
public TransportContainer getHotels(String table) {
try {
connection();
String sql = "SELECT * FROM " + table;
PreparedStatement pStmt = con.prepareStatement(sql);
ResultSet rs = pStmt.executeQuery();
while (rs.next()) {
v.addElement(new Hotel(rs.getString(2), rs.getString(3), rs
.getString(4), rs.getString(6), rs.getInt(5)));
}
} catch (Exception e) {
e.printStackTrace();
}
tc.setData(v);
return tc;
}
}
---------------------------------------------------
the service uses a class called TransportContainer, which contains the
data that should be send from the service to the client. this class can
be found here:
---------------------------------------------------
package de.testService;
import java.util.Vector;
public class TransportContainer {
public TransportContainer() {
}
public Vector v;
public void setData(Vector data) {
this.v = data;
}
public Vector getData() {
return this.v;
}
}
---------------------------------------------------
to invoke the service, i wrote a client which can be found here:
---------------------------------------------------
package de.wsTester;
import javax.xml.namespace.QName;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;
import de.testService.*;
public class TestClient {
public static void main(String[] args) throws AxisFault {
RPCServiceClient sender = new RPCServiceClient();
Options options = sender.getOptions();
EndpointReference targetERP = new EndpointReference(
"http://localhost:8080/axis2/services/testService");
options.setTo(targetERP);
QName opGetHotels = new QName("http://testService.de",
"getHotels");
String table = "hotels";
Object[] opArgs = new Object[] { table };
Class[] returnTypes = new Class[] { TransportContainer.class };
Object[] response = sender.invokeBlocking(opGetHotels,
opArgs,returnTypes);
}
}
---------------------------------------------------
when i start the client, i get the following exception:
---------------------------------------------------
Exception in thread "main" java.lang.IllegalArgumentException: argument
type mismatch
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at
org.apache.axis2.databinding.utils.BeanUtil.deserialize(BeanUtil.java:391)
at
org.apache.axis2.databinding.utils.BeanUtil.processObject(BeanUtil.java:655)
at
org.apache.axis2.databinding.utils.BeanUtil.ProcessElement(BeanUtil.java:603)
at
org.apache.axis2.databinding.utils.BeanUtil.deserialize(BeanUtil.java:535)
at
org.apache.axis2.rpc.client.RPCServiceClient.invokeBlocking(RPCServiceClient.java:103)
at de.wsTester.TestClient.main(TestClient.java:29)
---------------------------------------------------
thx to soapmonitor, i can see that the service return the expected
data-structure
---------------------------------------------------
<?xml version='1.0' encoding='utf-8'?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<ns:getHotelsResponse xmlns:ns="http://testService.de">
<ns:return xmlns:ax21="http://testService.de/xsd"
type="de.testService.TransportContainer">
<ax21:data type="de.testService.Hotel">
<ax21:hotelCity>München</ax21:hotelCity>
<ax21:hotelCode>AX001</ax21:hotelCode>
<ax21:hotelName>Axis2 Grand Hotel</ax21:hotelName>
<ax21:numOfStars>5</ax21:numOfStars>
</ax21:data>
<ax21:data type="de.testService.Hotel">
<ax21:hotelCity>Hamburg</ax21:hotelCity>
<ax21:hotelCode>AX010</ax21:hotelCode>
<ax21:hotelName>Axis2 Plaza</ax21:hotelName>
<ax21:numOfStars>4</ax21:numOfStars>
</ax21:data>
<ax21:data type="de.testService.Hotel">
<ax21:hotelCity>Unterammergau</ax21:hotelCity>
<ax21:hotelCode>AX050</ax21:hotelCode>
<ax21:hotelName>Achsenhütte</ax21:hotelName>
<ax21:numOfStars>1</ax21:numOfStars>
</ax21:data>
</ns:return>
</ns:getHotelsResponse>
</soapenv:Body>
</soapenv:Envelope>
-------------------------------------------------
whats wrong with my code? i would be thankful for any advice or hints on
how to improve my code.
greetings,
matthias
be found here:
---------------------------------------------------
package de.testService;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Vector;
public class TestService {
public Connection con = null;
TransportContainer tc = new TransportContainer();
Vector v = new Vector();
public final void connection() throws Exception {
Class.forName("com.mysql.jdbc.Driver");
con = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/travelagent", "root", "");
}
public TransportContainer getHotels(String table) {
try {
connection();
String sql = "SELECT * FROM " + table;
PreparedStatement pStmt = con.prepareStatement(sql);
ResultSet rs = pStmt.executeQuery();
while (rs.next()) {
v.addElement(new Hotel(rs.getString(2), rs.getString(3), rs
.getString(4), rs.getString(6), rs.getInt(5)));
}
} catch (Exception e) {
e.printStackTrace();
}
tc.setData(v);
return tc;
}
}
---------------------------------------------------
the service uses a class called TransportContainer, which contains the
data that should be send from the service to the client. this class can
be found here:
---------------------------------------------------
package de.testService;
import java.util.Vector;
public class TransportContainer {
public TransportContainer() {
}
public Vector v;
public void setData(Vector data) {
this.v = data;
}
public Vector getData() {
return this.v;
}
}
---------------------------------------------------
to invoke the service, i wrote a client which can be found here:
---------------------------------------------------
package de.wsTester;
import javax.xml.namespace.QName;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;
import de.testService.*;
public class TestClient {
public static void main(String[] args) throws AxisFault {
RPCServiceClient sender = new RPCServiceClient();
Options options = sender.getOptions();
EndpointReference targetERP = new EndpointReference(
"http://localhost:8080/axis2/services/testService");
options.setTo(targetERP);
QName opGetHotels = new QName("http://testService.de",
"getHotels");
String table = "hotels";
Object[] opArgs = new Object[] { table };
Class[] returnTypes = new Class[] { TransportContainer.class };
Object[] response = sender.invokeBlocking(opGetHotels,
opArgs,returnTypes);
}
}
---------------------------------------------------
when i start the client, i get the following exception:
---------------------------------------------------
Exception in thread "main" java.lang.IllegalArgumentException: argument
type mismatch
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at
org.apache.axis2.databinding.utils.BeanUtil.deserialize(BeanUtil.java:391)
at
org.apache.axis2.databinding.utils.BeanUtil.processObject(BeanUtil.java:655)
at
org.apache.axis2.databinding.utils.BeanUtil.ProcessElement(BeanUtil.java:603)
at
org.apache.axis2.databinding.utils.BeanUtil.deserialize(BeanUtil.java:535)
at
org.apache.axis2.rpc.client.RPCServiceClient.invokeBlocking(RPCServiceClient.java:103)
at de.wsTester.TestClient.main(TestClient.java:29)
---------------------------------------------------
thx to soapmonitor, i can see that the service return the expected
data-structure
---------------------------------------------------
<?xml version='1.0' encoding='utf-8'?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<ns:getHotelsResponse xmlns:ns="http://testService.de">
<ns:return xmlns:ax21="http://testService.de/xsd"
type="de.testService.TransportContainer">
<ax21:data type="de.testService.Hotel">
<ax21:hotelCity>München</ax21:hotelCity>
<ax21:hotelCode>AX001</ax21:hotelCode>
<ax21:hotelName>Axis2 Grand Hotel</ax21:hotelName>
<ax21:numOfStars>5</ax21:numOfStars>
</ax21:data>
<ax21:data type="de.testService.Hotel">
<ax21:hotelCity>Hamburg</ax21:hotelCity>
<ax21:hotelCode>AX010</ax21:hotelCode>
<ax21:hotelName>Axis2 Plaza</ax21:hotelName>
<ax21:numOfStars>4</ax21:numOfStars>
</ax21:data>
<ax21:data type="de.testService.Hotel">
<ax21:hotelCity>Unterammergau</ax21:hotelCity>
<ax21:hotelCode>AX050</ax21:hotelCode>
<ax21:hotelName>Achsenhütte</ax21:hotelName>
<ax21:numOfStars>1</ax21:numOfStars>
</ax21:data>
</ns:return>
</ns:getHotelsResponse>
</soapenv:Body>
</soapenv:Envelope>
-------------------------------------------------
whats wrong with my code? i would be thankful for any advice or hints on
how to improve my code.
greetings,
matthias