无法使用Java将POST请求中的ArrayList发送到REST服务器

sandeep.ganage

我是Java REST服务的新手,而不是整个Java客户端服务器。我正在尝试实现基本的客户端服务器设计。

从客户端,我试图发布ArrayList特定类(POJO)的对象。以下是我的客户端代码:

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。为此,请从您的观点中删除以下注释:

@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,请确保在类路径上具有此链接中描述的所有依赖项

更多信息

要了解有关常见媒体类型表示形式支持的更多信息,请查看此链接

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

无法将POST请求发送到服务器

无法通过POST请求将json数据发送到服务器

如何通过Java(Android App)中的POST请求将音频文件发送到服务器?

改造:将POST请求发送到android中的服务器

使用Ajax POST请求将图像和JSON数据发送到服务器?

使用带有 jQuery 的 POST 请求将数据发送到服务器

无法使用angularjs $ http请求将参数发送到服务器操作方法

无法在带有 Java 的 Android Studio 中使用 HTTP POST 将 JSON 发送到我的服务器

通过Java中的终端将HTTP PUT请求发送到服务器

使用Java将Ajax请求发送到Rails服务器

使用 GET 将信息发送到 REST API 中的服务器

Kafka-无法使用Java将消息发送到远程服务器

使用jQuery post或类似的异步JavaScript请求将空数组发送到服务器

通过AsyncHttpClient将JSON作为POST请求发送到服务器

将JSON POST请求发送到外部域,而无需访问服务器

Axios POST 请求将数据发送到 Express 服务器但错误 404

我无法将发布请求从反应表单发送到烧瓶服务器

将POST请求发送到服务器,服务器的响应为空,Angular-Spring-boot

无法将数据发送到libwebsocket服务器

齐射无法将数据发送到服务器

OkHttp:无法通过POST方法将数据发送到服务器

将HTTPS请求发送到Alpine Linux中仅TLS1.0的服务器

如何出于统计目的将请求发送到Swift中的外部服务器

使用提取将发布请求发送到Golang服务器

如何使用http请求将时区信息发送到服务器?

如何使用python将请求发送到tensorflow服务器(tensorflow-serving)?

使用codeigniter将发布请求发送到xmlrpc服务器

如何使用python将图像旋转请求发送到gprc服务器?

如何使用@ NgRx / effects仅将请求发送到服务器一次