gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:58:29 24 4
gpt4 key购买 nike

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

从客户端,我尝试发布特定类(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;
}
}

Server 返回类 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。为此,请从您的 enpoint 中删除以下注释:

@Consumes(MediaType.APPLICATION_XML)

并添加以下内容:

@Consumes(MediaType.APPLICATION_JSON)

如果您想同时支持 XML 和 JSON 表示形式,请使用:

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

MOXy

当您使用 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,请确保拥有此 link 中描述的所有所需依赖项。在你的类路径上。

jackson 2.x

Jackson 2.x 提供了 very rich set of annotations从 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,请确保您拥有此 link 中描述的所有依赖项在你的类路径上。

更多信息

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

关于java - 无法使用 Java 将 POST 请求中的 ArrayList 发送到 REST 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33211209/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com