2016-07-15 52 views
0

我想通過POST請求刪除我通過使用JSON得到的對象。然後通過使用對象ID,我想使用DELETE請求將其刪除。 DELETE請求迴應204 No ContentDELETE方法將不會正確刪除實體

這一切都很好,但當我使用GET請求獲取所有現有對象時,被刪除的對象仍然存在。

我通過將id作爲@PathParam()來刪除對象。

我測試過使用普通Java的操作,它工作正常。

DatabaseClass.java

public class DatabaseClass { 

    private static Map<Integer, Message> messages = new HashMap<>(); 
    private static Map<String, Profile> profiles = new HashMap<>(); 

    public static Map<Integer, Message> getAllMessages() { 
     return messages; 
    } 

    public static Map<String, Profile> getAllProfiles() { 
     return profiles; 
    } 
} 

Message.java

@XmlRootElement 
public class Message { 

    private Integer id; 
    private String author; 
    private String text; 
    private Date dateCreated; 

    public Message() {} 

    public Message(String author, String text) { 
     this.author = author; 
     this.text = text; 
     this.dateCreated = new Date(); 
    } 

    public Integer getId() { 
     return id; 
    } 

    public void setId(Integer id) { 
     this.id = id; 
    } 

    public String getAuthor() { 
     return author; 
    } 

    public void setAuthor(String author) { 
     this.author = author; 
    } 

    public String getText() { 
     return text; 
    } 

    public void setText(String text) { 
     this.text = text; 
    } 

    public Date getDateCreated() { 
     return dateCreated; 
    } 

    public void setDateCreated(Date dateCreated) { 
     this.dateCreated = dateCreated; 
    } 

    @Override 
    public String toString() { 
     StringBuilder sb = new StringBuilder(); 
     sb.append("ID: " + id + "\n"); 
     sb.append("Author: " + author + "\n"); 
     sb.append("Text: " + text + "\n"); 
     sb.append("Date Created: " + dateCreated + "\n\n"); 

     return sb.toString(); 
    } 
} 

MessageService.java

public class MessageService { 

    private Map<Integer, Message> messages = DatabaseClass.getAllMessages(); 

    public MessageService() {} 

    public List<Message> getMessages() { 
     return new ArrayList<>(messages.values()); 
    } 

    public Message getMessage(Integer id) { 
     if(!messages.containsKey(id)) { 
      throw new NotFoundException("Message was not found."); 
     } 

     return messages.get(id); 
    } 

    public Message addMessage(Message message) { 
     message.setId(messages.size() + 1); 
     message.setDateCreated(new Date()); 

     messages.put(message.getId(), message); 

     return messages.get(message.getId()); 
    } 

    public Message updateMessage(Message message) { 
     if(message.getId() <= 0) { 
      return null; 
     } 
     messages.put(message.getId(), message); 

     return messages.get(message.getId()); 
    } 

    public Message deleteMessage(Integer id) { 
     return messages.remove(id); 
    } 
} 

MessageResource.java

@Path("messages") 
@Consumes(MediaType.APPLICATION_JSON) 
@Produces(MediaType.APPLICATION_JSON) 
public class MessageResource { 

    private MessageService mService = new MessageService(); 

    @POST 
    public Message addMessage(Message message) { 
     return mService.addMessage(message); 
    } 

    @GET 
    public List<Message> getMessages() { 
     return mService.getMessages(); 
    } 

    @GET 
    @Path("{messageId}") 
    public Message getMessage(@PathParam("messageId") Integer messageId) { 
     return mService.getMessage(messageId); 
    } 

    @PUT 
    @Path("{messageId}") 
    public Message updateMessage(@PathParam("messageId") Integer messageId, 
      Message message) { 
     return mService.updateMessage(message); 
    } 

    @DELETE 
    @Path("{messagesId}") 
    public Message deleteMessage(@PathParam("messageId") Integer messageId) { 
     return mService.deleteMessage(messageId); 
    } 
} 

我在這裏還有另一個question,它包含另一個名爲Profile的對象。 ProfileResource.java類具有POST,PUT,GET和DELETE方法。如果我刪除了一個配置文件,我得到的迴應是200 OK而不是204 No Content,我覺得很奇怪,因爲我應該得到一個204 No Content。無論哪種方式成功刪除配置文件。

+0

你如何實例化你的資源/服務對象?它看起來像服務從'DatabaseClass'中檢索事件作爲實例初始化的一部分,而remove()操作只是從該實例中刪除數據,而不是從底層數據庫中刪除數據。如果服務是按照請求創建的,那麼刪除操作僅在該請求期間有效。 – sisyphus

+0

我也遇到過和刪除一樣的東西!你解決了嗎? 個別地,這些方法工作正常,但是當我在postman中使用get方法時,它最終會顯示我們在構造函數中聲明的那些值。 – Chip

回答

1

因爲MessageService正在創建調用資源中構造函數的每個請求。

private MessageService mService = new MessageService(); 

如果使用POST和DELETE創建新消息,則同樣可行。

+0

我們該如何避免這種情況?我也遇到了與上面相同的帖子並更新。有什麼辦法可以使用get方法看到更新的結果嗎?每次使用get postman時,它最終都會顯示出在構造函數中聲明的相同的2個結果。 – Chip