2014年4月13日日曜日

Spring for Android Json 取得

Spring Json 返却 VB.NET 表示 で作成した
jp.s6131.sample.controller.HomeController.sampleList
を android アプリから呼び出す。

jp.s6131.sampleApp.Code.java
getter/setter 無いと HttpMessageNotReadableException 発生
public class Code {
    String id;
    String code;
    String name;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getCode() {
        return code;
    }
    public void setCode(String code) {
        this.code = code;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

jp.s6131.sampleApp.HelloAndroidActivity.java
public class HelloAndroidActivity extends Activity {
    private static String TAG = "sampleApp";
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.i(TAG, "onCreate");
        Uri.Builder builder = new Uri.Builder();
        AsyncHttpRequest task = new AsyncHttpRequest(this);
        task.execute(builder);
        setContentView(R.layout.main);
    }
}

jp.s6131.sampleApp.AsyncHttpRequest.java
public class AsyncHttpRequest extends AsyncTask<Uri.Builder, Void, String> {
    private Activity mainActivity;
    public AsyncHttpRequest(Activity activity) {
        this.mainActivity = activity;
    }
    @Override
    protected String doInBackground(Uri.Builder... builder) {
        RestTemplate template = new RestTemplate();
        template.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
        String url = "http://10.0.2.2/sample/sampleList?cd=cd1";
        try {
            ResponseEntity<Code[]> responseEntity = template.exchange(url, HttpMethod.GET, null, Code[].class);
            Code[] resList = responseEntity.getBody();
            for (Code res : resList) {
                Log.i("sampleApp id = ", (res.id == null ? "null" : res.id));
                Log.i("sampleApp code = ", (res.code == null ? "null" : res.code));
                Log.i("sampleApp name = ", (res.name == null ? "null" : res.name));
            }
            return resList.toString();
        } catch (Exception e) {
            Log.d("Error", e.toString());
        }
        return "";
    }
    @Override
    protected void onPostExecute(String result) {
    }
}

AndroidManifest.xml 追加
<uses-permission android:name="android.permission.INTERNET" />

LogCat ビュー(ログ)の表示
「ウィンドウ」「ビューの表示」「その他」「Android」「LogCat」

仮想デバイスの作成
「ウィンドウ」「Android仮想デバイス・マネージャ」「新規」
装置:Nexus 5
ターゲット:Android 4.4.2 - API Level 19
CPU/ABI:ARM (armeabi-v7a)
メモリー・オプション:RAM:1024
「ホスト GPU を使用する」にチェック
OKで保存、開始ボタンで AVD 開始。
sample プロジェクトサーバー(Tomcat)も起動。

android アプリプロジェクト右クリック、「デバッグ」「Androidアプリケーション」
Conversion to Dalvik format failed: Unable to execute dex: Multiple dex files define Lorg/springframework/core/ErrorCoded
エラーが発生。
Java のビルド・パス、順序およびエクスポートでMaven依存関係からチェックを外すとエラーが消えるが、
実行時に spring for android クラスが not found となってしまう。
pom.xml で exclusion 設定を行う。さらに
java.lang.NoClassDefFoundError: com.fasterxml.jackson.databind.ObjectMapper
が発生するので fasterxml も追加

pom.xml
<dependency>
    <groupId>org.springframework.android</groupId>
    <artifactId>spring-android-rest-template</artifactId>
    <version>1.0.1.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.android</groupId>
    <artifactId>spring-android-auth</artifactId>
    <version>1.0.1.RELEASE</version>
    <exclusions>
        <exclusion>
            <artifactId>spring-core</artifactId>
            <groupId>org.springframework</groupId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework.android</groupId>
    <artifactId>spring-android-core</artifactId>
    <version>1.0.1.RELEASE</version>
    <exclusions>
        <exclusion>
            <artifactId>spring-core</artifactId>
            <groupId>org.springframework</groupId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.2.3</version>
</dependency>

LogCat ビュー で結果を確認。


人気ブログランキングへ