1

以下のスクリーンショットに示すように、この記事に従って、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>
4

1 に答える 1

0

javax.*最後に、パッケージが Android でサポートされていないことを知った後、このアプローチを断念しました。

私はこれに似たものを使用しました:

class RequestTask extends AsyncTask<String, String, String> {

    @Override
    protected String doInBackground(String... uri) {
        HttpClient httpclient = getNewHttpClient();
        HttpResponse response;
        String add = "{\"MemberNo\":\"" + uri[0] + "\"}";
        HttpPost postMethod = new HttpPost(wsdl);// + add
        String responseString = null;
        try {
            postMethod.addHeader("Content-Type", "application/json");
            HttpEntity entity = new StringEntity(add);
            postMethod.setEntity(entity);
            response = httpclient.execute(postMethod);

            StatusLine statusLine = response.getStatusLine();
            if (statusLine.getStatusCode() == HttpStatus.SC_OK) {
                ByteArrayOutputStream out = new ByteArrayOutputStream();
                response.getEntity().writeTo(out);
                out.close();
                responseString = out.toString();
            } else {
                response.getEntity().getContent().close();
                throw new IOException(statusLine.getReasonPhrase());
            }
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return responseString;
    }
  }

お時間とご回答ありがとうございます。

于 2013-06-11T09:35:22.257 に答える