我是webservices和REST的新手。我正在尝试使用rest java client向休息服务发送消息作为发布请求。我正在尝试获取先前请求的响应(以json格式的所有内容)。因此,我将消息对象存储到arraylist并将列表作为响应发送。但我无法获得以前的消息。如果我做错了请告诉我。 这是我的消息模型类。
public class Messages {
private String id;
private String message;
public Messages() {
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
以下是我的webservice接收消息对象并返回一个json数组。
@Path("/json/messages")
public class JSONMessages {
List<Messages> list = new ArrayList<Messages>();
public List<Messages> getAllMessages(Messages m){
list.add(m);
return list;
}
@POST
@Path("/post")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response MessageListInJSON(Messages msg) {
System.out.println("message saved");
if(!(msg.getId().equals("1"))){
String output ="Invalid User";
return Response.ok(output).build();
}
else{
return Response.ok(getAllMessages(msg)).build();
}
}
}
最后,以下是我的客户端代码
public class ClientPost {
public static void main(String[] args) {
try {
ClientConfig clientConfig = new DefaultClientConfig();
Client client = Client.create(clientConfig);
WebResource webResource = client
.resource("http://localhost:8050/lab.rest.webservices/rest/json/messages/post");
//for(int i=0;i<5;i++){
String input = "{\"id\":\"1\", \"message\":\"hey there!\"}";
ClientResponse response = webResource.accept("application/json").type("application/json")
.entity(input).post(ClientResponse.class);
if (response.getStatus() !=200 ) {
throw new RuntimeException("Failed : HTTP error code : "
+ response.getStatus());
}
System.out.println("Output from Server .... \n");
String output = response.getEntity(String.class);
System.out.println(output+"\n");
}
catch (Exception e) {
e.printStackTrace();
}
} }
现在,我期待看到的是我发送的消息以及存储在数组列表中的先前响应(通过现在多次手动运行客户端发送)但总是只有当前消息结束
输出:
服务器输出....
[{&#34; id&#34;:&#34; 1&#34;,&#34; message&#34;:&#34;嘿那里!&#34;}]
准确地说,当我多次运行我的客户端(或将try块放入循环)时我想要的输出如下所示,我无法得到。
服务器输出....
[{&#34; id&#34;:&#34; 1&#34;,&#34;消息&#34;:&#34;嘿那里!&#34;},{&#34; id&#34;:&#34; 1&#34;,&#34;消息&#34;:&#34;嘿那里!&#34;},{&#34; id&#34;:&#34; 1&#34;,&#34;消息&#34;:&#34;嘿那里!&#34;},{&#34; id&#34;:&#34; 1&#34;,&#34;消息&#34;:&#34;嘿那里!&#34;}]。
答案 0 :(得分:0)
JAXRS中的资源不是单身人士。这意味着对于每个请求,实例化类JSONMessages
。所以你丢失了属性list
的内容。将其更改为静态可以解决您的问题。
有一个注释Singleton
可以更改此行为。在这种情况下,资源将作为单例管理,而不是在请求范围内。这是一个示例:
@Singleton
@Path("/json/messages")
public class JSONMessages {
(...)
}
否则,请注意列表上的并发访问。有关详细信息,请参阅此问题:java concurrent Array List access。
希望它可以帮到你, 亨利