2016-07-15 6 views
0

POSTリクエストでJSONを使用して取得したオブジェクトを削除しようとしています。オブジェクトIDを使用して、DELETEリクエストを使用してオブジェクトIDを削除したいとします。 リクエストは204 No Contentで応答します。DELETEメソッドがエンティティを正しく削除しない

これはすべて役に立ちましたが、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() '操作はそのインスタンスからデータを取り除くだけで、基礎となるDBからデータを取り除いているようです。要求ごとにサービスが作成された場合、削除操作はその要求の期間だけ有効です。 – sisyphus

+0

私はポストと同じことに遭遇し、削除も!あなたはそれを解決しましたか? 個々に、これらのメソッドは正常に動作していますが、私がpostメソッドでgetメソッドを使用すると、コンストラクタで宣言した値が表示されてしまいます。 – Chip

答えて

1

リソース内のコンストラクタを呼び出す要求ごとにMessageServiceが作成されているためです。

private MessageService mService = new MessageService(); 

POSTとDELETEを使用して新しいメッセージを作成すると、同じことができます。

+0

どうすればそれを避けることができますか?私はポストとアップデートでも同じことに遭遇しました。 getメソッドを使用して更新された結果を確認する方法はありますか?私が郵便配達で取得するたびに、コンストラクタで宣言されている同じ2つの結果が表示されます。 – Chip

関連する問題