Apache HttpClient - REST API:将响应转换为自定义对象的问题,该对象被置为SerializableEntity

时间:2015-09-30 14:01:43

标签: rest apache-httpclient-4.x

我正在使用Apache HttpClient使用REST API来放置/获取自定义对象。下面是示例代码。我的putObject()方法工作正常,我可以序列化Person对象并正确放置。但是,在获取对象时,我得到了以下错误:

Exception in thread "main" java.lang.ClassCastException: [B cannot be cast to Person    at MyTest.demoGetRESTAPI(MyTest.java:88)    at MyTest.main(MyTest.java:21)

似乎构建Person对象的响应实体的代码不正确

  HttpEntity httpEntity = response.getEntity();
            byte[] resultByteArray = EntityUtils.toByteArray(httpEntity);
            Person person = (Person)SerializationUtils.deserialize(resultByteArray);

在获取byte []数组并转换为Person对象时,我是否做错了。请帮我解决这个问题。

完成示例程序:

import java.io.Serializable;

import org.apache.commons.lang.SerializationUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.entity.SerializableEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;

public class MyTest {

    public static void main(String[] args) throws Exception  {

        putObject();

        getObject();
    }

    public static void putObject() throws Exception
    {
        HttpClient httpClient = new DefaultHttpClient();

       Person person = new Person();
       person.setName("Narendra");
       person.setId("1");

        try
        {
            //Define a postRequest request
            HttpPut putRequest = new HttpPut("http://localhost:9084/ehcache-server/rest/screeningInstance/2221");

            //Set the API media type in http content-type header
            putRequest.addHeader("content-type", "application/x-java-serialized-object");

            //Set the request put body
            SerializableEntity personSEntity = new SerializableEntity(SerializationUtils.serialize(person));
            putRequest.setEntity(personSEntity);

            //Send the request; It will immediately return the response in HttpResponse object if any
            HttpResponse response = httpClient.execute(putRequest);

            //verify the valid error code first
            int statusCode = response.getStatusLine().getStatusCode();
            if (statusCode != 201)
            {
                throw new RuntimeException("Failed with HTTP error code : " + statusCode);
            }
        }
        finally
        {
            //Important: Close the connect
            httpClient.getConnectionManager().shutdown();
        }
    }

    public static void getObject() throws Exception
    {
        DefaultHttpClient httpClient = new DefaultHttpClient();
        try
        {
            //Define a HttpGet request; You can choose between HttpPost, HttpDelete or HttpPut also.
            //Choice depends on type of method you will be invoking.
            HttpGet getRequest = new HttpGet("http://localhost:9084/ehcache-server/rest/screeningInstance/2221");

            //Set the API media type in http accept header
            getRequest.addHeader("accept", "application/x-java-serialized-object");

            //Send the request; It will immediately return the response in HttpResponse object
            HttpResponse response = httpClient.execute(getRequest);

            //verify the valid error code first
            int statusCode = response.getStatusLine().getStatusCode();
            if (statusCode != 200)
            {
                throw new RuntimeException("Failed with HTTP error code : " + statusCode);
            }

            //Now pull back the response object

            HttpEntity httpEntity = response.getEntity();
            byte[] resultByteArray = EntityUtils.toByteArray(httpEntity);
            Person person = (Person)SerializationUtils.deserialize(resultByteArray);           
        }
        finally
        {
            //Important: Close the connect
            httpClient.getConnectionManager().shutdown();
        }
    }

}

class Person implements Serializable{
    String name;
    String id;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    @Override
    public String toString() {
        return "Person [name=" + name + ", id=" + id + "]";
    }


}

1 个答案:

答案 0 :(得分:1)

我得到了解决方案。我的代码错了:

在放置对象时,我写了下面的代码。那是两次序列化。首先是从Person对象到byte [],第二个是从byte []到byte []。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context="com.qarun.qpcbeta.ProductionCommentsActivity"
android:id="@+id/relativeLayout">


<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:text="Production Comments"
    android:id="@+id/textView6"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true" />

<EditText
    android:layout_width="100dp"
    android:layout_height="wrap_content"
    android:inputType="date"
    android:ems="10"
    android:id="@+id/editTextFrom"
    android:layout_below="@+id/textView6"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_marginTop="29dp"
    android:editable="false"
    android:textSize="13sp"
    android:text="From:"
    android:focusable="false"/>

<EditText
    android:layout_width="100dp"
    android:layout_height="wrap_content"
    android:inputType="date"
    android:ems="10"
    android:id="@+id/editTextTo"
    android:layout_alignTop="@+id/editTextFrom"
    android:layout_toLeftOf="@+id/btnSearch"
    android:layout_toStartOf="@+id/btnSearch"
    android:textSize="13sp"
    android:textIsSelectable="false"
    android:text="To:"
    android:focusable="false"/>

<ListView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/listView"
    android:layout_below="@+id/editTextTo"
    android:layout_alignParentRight="true"
    android:layout_alignParentEnd="true"/>

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Search"
    android:id="@+id/btnSearch"
    android:onClick="searchDates"
    android:layout_above="@+id/listView"
    android:layout_alignRight="@+id/listView"
    android:layout_alignEnd="@+id/listView"/>

这是正确的方法:

SerializableEntity personSEntity = new SerializableEntity(SerializationUtils.serialize(person));
            putRequest.setEntity(personSEntity);

从REST获取二进制文件后,代码应如下所示获取Object:

SerializableEntity personSEntity = new SerializableEntity(person);
            putRequest.setEntity(personSEntity);

这就像CHARM !!