从休息服务中发送arraylist

时间:2015-09-24 19:46:10

标签: json rest arraylist

我是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;}]。

1 个答案:

答案 0 :(得分:0)

JAXRS中的资源不是单身人士。这意味着对于每个请求,实例化类JSONMessages。所以你丢失了属性list的内容。将其更改为静态可以解决您的问题。

有一个注释Singleton可以更改此行为。在这种情况下,资源将作为单例管理,而不是在请求范围内。这是一个示例:

@Singleton
@Path("/json/messages")
public class JSONMessages {
    (...)
}

否则,请注意列表上的并发访问。有关详细信息,请参阅此问题:java concurrent Array List access

希望它可以帮到你, 亨利