以下のスクリーンショットに示すように、この記事に従って、Web サービス (Java) とクライアント アプリケーション (Android アプリ) を作成しました。
また、記事の Web サービス クライアントの作成セクションでAnt ビルド ファイルを作成した後、 BUILD SUCCESSFULメッセージが表示され、クライアント アプリの下に、下の画像 (2) に示すように 8 つのファイルが生成されます。
HelloWebService service = new HelloWebService();
クライアントアプリに書き込むと、アプリがクラッシュし、次の例外が発生します:
java.lang.NoClassDefFoundError: com.mycompany.service.client.HelloWebService
しかし、次のように Java アプリで同じ Web サービスを使用しようとすると、機能します。
HelloWebService service = new HelloWebService();
com.myservice.service.client.HelloWeb helloWeb = service.getHelloWebPort();
String response = helloWeb.sayGreeting(input);
私は何か間違ったことをしていますか?
どんな助けでも感謝します。
編集 (1)
両方のアプリで同様のコマンドを使用して、必要な Web サービス Java ファイルを生成していますが、構造は両方のアプリで異なります。Android アプリでは、ファイルはxmlディレクトリの下に生成されます。
コマンドは次のとおりです。wsimport -keep -s C:\Android\workspace\WebServiceDemo\src -p com.mycompany.service.client http://localhost:9898/HelloWeb?wsdl
編集 (2)
HelloWebService.java
package com.mycompany.service.client;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.logging.Logger;
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.6 in JDK 6
* Generated source version: 2.1
*
*/
@WebServiceClient(name = "HelloWebService", targetNamespace = "http://service.mycompany.com/", wsdlLocation = "http://localhost:9898/HelloWeb?wsdl")
public class HelloWebService
extends Service
{
private final static URL HELLOWEBSERVICE_WSDL_LOCATION;
private final static Logger logger = Logger.getLogger(com.mycompany.service.client.HelloWebService.class.getName());
static {
URL url = null;
try {
URL baseUrl;
baseUrl = com.mycompany.service.client.HelloWebService.class.getResource(".");
url = new URL(baseUrl, "http://localhost:9898/HelloWeb?wsdl");
} catch (MalformedURLException e) {
logger.warning("Failed to create URL for the wsdl Location: 'http://localhost:9898/HelloWeb?wsdl', retrying as a local file");
logger.warning(e.getMessage());
}
HELLOWEBSERVICE_WSDL_LOCATION = url;
}
public HelloWebService(URL wsdlLocation, QName serviceName) {
super(wsdlLocation, serviceName);
}
public HelloWebService() {
super(HELLOWEBSERVICE_WSDL_LOCATION, new QName("http://service.mycompany.com/", "HelloWebService"));
}
/**
*
* @return
* returns HelloWeb
*/
@WebEndpoint(name = "HelloWebPort")
public HelloWeb getHelloWebPort() {
return super.getPort(new QName("http://service.mycompany.com/", "HelloWebPort"), HelloWeb.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 HelloWeb
*/
@WebEndpoint(name = "HelloWebPort")
public HelloWeb getHelloWebPort(WebServiceFeature... features) {
return super.getPort(new QName("http://service.mycompany.com/", "HelloWebPort"), HelloWeb.class, features);
}
}
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.webservicedemo"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<uses-permission android:name="android.permission.INTERNET" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.webservicedemo.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>