G
Guest
Gast
Ich habefolgendes Problem:
Ich möchte per Reflection auf einen WebService zugreifen -hört sich komisch an, is aber nun mal so :roll:
Ich hab mir die Stubs generieren lassen und nun möchte ich recht generisch auf diese Stubs zugreifen können...
Die Syntax der Methode sieht wie folgt aus:
Ich hab mir nun per Reflection die ServiceClass besorgt und ich kann dort auch die Methode aufrufen, die mir dann das Interface zurückgibt, um Schlussendlich auf den WebService zuzugreifen.
Nur hier liegt das Problem:
Da ich keine Klasse zurückbekomm, sondern einen Proxy (da es sich ja um ein Interface handelt) kann ich daran nicht wie gewöhnlich mit .invoke() einen Methodenaufruf absetzen...
Meine Frage ist nun also, wie ich an diesem Proxy einen Methodenaufruf absetzen kann :?:
Hier noch der komplette Code:
Aufgerufen wird die Methode wie folgt:
Hier noch die Klasse CalculatorService
sowie das Interface
Der webService läuft und ein normaler Aufruf daran mit diesengenerierten Klassen klappt auch wunderbar. Nur an diesem Proxy komm ich eben nicht weiter... ???:L
Ich möchte per Reflection auf einen WebService zugreifen -hört sich komisch an, is aber nun mal so :roll:
Ich hab mir die Stubs generieren lassen und nun möchte ich recht generisch auf diese Stubs zugreifen können...
Die Syntax der Methode sieht wie folgt aus:
Code:
public void testServiceReflection(String serviceName, String port, String method) {...}
Ich hab mir nun per Reflection die ServiceClass besorgt und ich kann dort auch die Methode aufrufen, die mir dann das Interface zurückgibt, um Schlussendlich auf den WebService zuzugreifen.
Nur hier liegt das Problem:
Da ich keine Klasse zurückbekomm, sondern einen Proxy (da es sich ja um ein Interface handelt) kann ich daran nicht wie gewöhnlich mit .invoke() einen Methodenaufruf absetzen...
Meine Frage ist nun also, wie ich an diesem Proxy einen Methodenaufruf absetzen kann :?:
Hier noch der komplette Code:
Code:
public void testServiceReflection(String serviceName, String port, String method) throws Throwable {
Class<?> serviceClass = null;
Class<?> implementingClass = null;
Method accessImplementation = null;
Method webServiceMethod = null;
// first get the serviceClass
try {
// search for the class in the package "client"
serviceClass = Class.forName( "client."+serviceName );
} catch (Exception e) {
e.printStackTrace();
}
// return if there is no suitable class
if(serviceClass == null) return;
// The parameterlist of the method accessImplementation
Class[] parameterTypes_accessImplementation = new Class[] {};
Object[] arguments_accessImplementation = new Object[] {};
try {
accessImplementation = serviceClass.getMethod("get"+port, parameterTypes_accessImplementation);
implementingClass = (accessImplementation.invoke(serviceClass.newInstance(), arguments_accessImplementation)).getClass();
} catch (Exception e) {
e.printStackTrace();
}
webServiceMethod = implementingClass.getMethod(method, parameterTypes);
System.out.println("The webservice method :" +webServiceMethod.getName());
try {
// HIER sollte der Aufruf rein... also ein Methodenaufru an die implementingclass...
} catch (Exception e) {
e.printStackTrace();
}
}
Aufgerufen wird die Methode wie folgt:
Code:
testServiceReflection("CalculatorService", "CalculatorPort", "addValues");
Hier noch die Klasse CalculatorService
Code:
package client;
import java.net.MalformedURLException;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import javax.xml.ws.WebEndpoint;
import javax.xml.ws.WebServiceClient;
import javax.xml.ws.WebServiceFeature;
/**
* This class was generated by the JAX-WS RI.
* JAX-WS RI 2.1.1 in JDK 6
* Generated source version: 2.1
*
*/
@WebServiceClient(name = "CalculatorService", targetNamespace = "http://service/", wsdlLocation = "http://localhost:8080/calculator?wsdl")
public class CalculatorService
extends Service
{
private final static URL CALCULATORSERVICE_WSDL_LOCATION;
static {
URL url = null;
try {
url = new URL("http://localhost:8080/calculator?wsdl");
} catch (MalformedURLException e) {
e.printStackTrace();
}
CALCULATORSERVICE_WSDL_LOCATION = url;
}
public CalculatorService(URL wsdlLocation, QName serviceName) {
super(wsdlLocation, serviceName);
}
public CalculatorService() {
super(CALCULATORSERVICE_WSDL_LOCATION, new QName("http://service/", "CalculatorService"));
}
/**
*
* @return
* returns Calculator
*/
@WebEndpoint(name = "CalculatorPort")
public Calculator getCalculatorPort() {
return (Calculator)super.getPort(new QName("http://service/", "CalculatorPort"), Calculator.class);
}
/**
*
* @param features
* A list of {@link javax.xml.ws.WebServiceFeature} to configure on the proxy. Supported features not in the <code>features</code> parameter will have their default values.
* @return
* returns Calculator
*/
@WebEndpoint(name = "CalculatorPort")
public Calculator getCalculatorPort(WebServiceFeature... features) {
return (Calculator)super.getPort(new QName("http://service/", "CalculatorPort"), Calculator.class, features);
}
}
sowie das Interface
Code:
package client;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
/**
* This class was generated by the JAX-WS RI.
* JAX-WS RI 2.1.1 in JDK 6
* Generated source version: 2.1
*
*/
@WebService(name = "Calculator", targetNamespace = "http://service/")
@SOAPBinding(style = SOAPBinding.Style.RPC)
public interface Calculator {
/**
*
* @param arg1
* @param arg0
* @return
* returns long
*/
@WebMethod
@WebResult(partName = "return")
public long addValues(
@WebParam(name = "arg0", partName = "arg0")
int arg0,
@WebParam(name = "arg1", partName = "arg1")
int arg1);
}
Der webService läuft und ein normaler Aufruf daran mit diesengenerierten Klassen klappt auch wunderbar. Nur an diesem Proxy komm ich eben nicht weiter... ???:L