簡體   English   中英

無法使用Java將POST請求中的ArrayList發送到REST服務器

[英]Not able to send an ArrayList in a POST request to the REST server using Java

我是Java REST服務的新手,而不是整個Java客戶端服務器。 我正在嘗試實現基本的客戶端服務器設計。

從客戶端我試圖POST一個特定類(POJO)的對象的ArrayList 以下是我的客戶端代碼:

public class TestClient1 {

    private static final String webServiceURI = "http://localhost:8080/IadssitHPCServer";
    private static URI serviceURI;
    private static WebTarget webTarget;
    private static ArrayList<ImageInput> imageList;

    public static void main(String[] args) {

        ClientConfig clientConfig = new ClientConfig();
        Client client   = ClientBuilder.newClient(clientConfig);
        serviceURI  = UriBuilder.fromUri(webServiceURI).build();
        webTarget   = client.target(serviceURI);
        webTarget   = webTarget.path("clientserver").path("restservice").path("analyze");

        imageList = new ArrayList<ImageInput>();

        /*
          Code to add objects in the Arraylist
        */  

        Session session= webTarget.request().accept(MediaType.APPLICATION_XML).
                post(Entity.entity(imageList, MediaType.APPLICATION_XML), Session .class);
    }
}

ImageInput (POJO)類:

@XmlRootElement
public class ImageInput implements Serializable {

    private String imageName;
    private String imageDirPath;

    public String getImageName() {
        return imageName;
    }
    public void setImageName(String imageName) {
        this.imageName = imageName;
    }
    public String getImageDirPath() {
        return imageDirPath;
    }
    public void setImageDirPath(String imageDirPath) {
        this.imageDirPath = imageDirPath;
    }
}

在服務器上:

@Path( "/hpcservice" )
@Consumes( MediaType.APPLICATION_XML )
@Produces( MediaType.APPLICATION_XML )
public class HpcService {

    @POST
    @Path( "/analyze" )
    public Session startAnalysing(ArrayList<ImageInput> clientInput){
        System.out.println( "Started Analyzing..." );
        return session;
    }
}

服務器返回類Session的對象,這又是一個POJO類。

當我執行代碼時,它在客戶端給出了以下錯誤:

Oct 19, 2015 3:01:10 PM org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor aroundWriteTo
SEVERE: MessageBodyWriter not found for media type=application/xml, type=class java.util.ArrayList, genericType=class java.util.ArrayList.
org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyWriter not found for media type=application/xml, type=class java.util.ArrayList, genericType=class java.util.ArrayList.
    at org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.aroundWriteTo(WriterInterceptorExecutor.java:247)
    at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:162)
    at org.glassfish.jersey.message.internal.MessageBodyFactory.writeTo(MessageBodyFactory.java:1154)
    at org.glassfish.jersey.client.ClientRequest.writeEntity(ClientRequest.java:503)
    at org.glassfish.jersey.client.HttpUrlConnector._apply(HttpUrlConnector.java:315)
    at org.glassfish.jersey.client.HttpUrlConnector.apply(HttpUrlConnector.java:227)
    at org.glassfish.jersey.client.ClientRuntime.invoke(ClientRuntime.java:246)
    at org.glassfish.jersey.client.JerseyInvocation$2.call(JerseyInvocation.java:683)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:228)
    at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:424)
    at org.glassfish.jersey.client.JerseyInvocation.invoke(JerseyInvocation.java:679)
    at org.glassfish.jersey.client.JerseyInvocation$Builder.method(JerseyInvocation.java:435)
    at org.glassfish.jersey.client.JerseyInvocation$Builder.post(JerseyInvocation.java:338)
    at com.TestClient1.main(TestClient1.java:61)

我想可能是我發送和接收的請求類型有問題。 這個MediaType.APPLICATION_..如何影響/隨我發送的不同數據結構而變化?

我知道我在這里提出了一個非常基本的問題,但無論我在Stack Overflow上找到什么在線解決方案,我都會變得更加困惑。

使用包裝類

考慮將ArrayList<ImageInput>包裝到類中,如下所示:

@XmlRootElement(name = "data")
@XmlAccessorType(XmlAccessType.FIELD)
public class ImageInputData {

    @XmlElement
    private ArrayList<ImageInput> images;

    // Getters and setters ommited
}

您的端點方法如下所示:

@POST
@Path("/analyze")
public Session startAnalysing(ImageInputData inputData) {

    List<ImageInput> images = inputData.getImages();    
    // Do any processing...
    return session;
}

使用JSON

或者,您可以使用JSON而不是XML。 要執行此操作,請從您的enpoints中刪除以下注釋:

@Consumes(MediaType.APPLICATION_XML)

並添加以下內容:

@Consumes(MediaType.APPLICATION_JSON)

如果您想同時支持XML和JSON表示,請使用:

@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })

莫西

當您使用JAXB注釋時,有趣的是,您可以使用JAXB注釋與Jersey生成JSON。

為此,您需要將MOXy依賴項添加到pom.xml

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-moxy</artifactId>
    <version>2.22.1</version>
</dependency>

如果您不使用Maven,請確保在類路徑中的此鏈接中描述了所有必需的依賴項。

傑克遜2.x

Jackson 2.x提供了一組非常豐富的注釋來從POJOS生成JSON。

如果您更喜歡使用Jackson 2.x作為JSON提供程序,則需要在pom.xml使用以下依賴項:

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-jackson</artifactId>
    <version>2.22.1</version>
</dependency>

如果您沒有使用Maven,請確保您在類路徑中具有此鏈接中描述的所有依賴項。

更多信息

要了解有關對常見媒體類型表示的支持的更多信息,請查看此鏈接

您可能希望在將arraylist發送到服務器之前將其轉換為JSON。 使用gson jar也可以做到這一點。

DataObject obj = new DataObject();
Gson gson = new Gson();

// convert java object to JSON format,
// and returned as JSON formatted string
String json = gson.toJson(obj);

將此字符串發送到服務器。 在服務器上解析json表示來構造您的Object。

Gson gson = new Gson();
//convert the json string back to object
DataObject obj = gson.fromJson(br, DataObject.class);

您的案例中的DataObject將是ArrayList

看看http://www.mkyong.com/java/how-do-convert-java-object-to-from-json-format-gson-api/

它們是JAXB(默認的java xml解析器),不知道如何將ArrayList作為給定的obect處理(因為它是匿名的等等)。 嘗試使用包含ArrayList作為字段的包裝類,然后發送該類而不是直接發送Arraylist

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM