2016-07-15 7 views
0

Ich versuche, ein Objekt zu löschen, das ich mit JSON durch eine POST Anfrage erhalten. Dann, indem ich die Objekt-ID verwende, möchte ich sie unter Verwendung einer DELETE Anfrage löschen. Die DELETE Anfrage antwortet mit einer 204 No Content.DELETE-Methode wird nicht ordnungsgemäß gelöscht Entität

Das ist alles gut, aber wenn ich die GET Anfrage verwende, um alle vorhandenen Objekte zu erhalten, ist das Objekt, das gelöscht wurde, immer noch da.

Ich lösche das Objekt, indem ich seine id als @PathParam().

Ich habe die Operation nur mit Plain Java getestet und es funktioniert gut.

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); 
    } 
} 

Ich habe auch eine andere question hier und es enthält ein anderes Objekt namens Profile. Die Klasse ProfileResource.java verfügt über die Methoden POST, PUT, GET und DELETE. Wenn ich ein Profil lösche, ist die Antwort, die ich zurückbekomme, 200 OK und nicht 204 No Content, die ich sehr seltsam finde, weil ich einen 204 No Content bekommen sollte. In beiden Fällen wird das Profil erfolgreich gelöscht.

+0

Wie instanziieren Sie Ihre Ressourcen-/Serviceobjekte? Es sieht so aus, als ob der Dienst Dinge aus 'DatabaseClass' als Teil der Instanzinitialisierung abruft, während der' remove() 'Vorgang nur die Daten von dieser Instanz entfernt und nicht von der darunterliegenden DB. Wenn der Dienst pro Anforderung erstellt wird, ist der Löschvorgang nur für die Dauer dieser Anforderung wirksam. – sisyphus

+0

Ich habe das gleiche mit Post und löschen auch gefunden! Hast du es gelöst? Einzeln, diese Methoden funktionieren gut, aber wenn ich get-Methode im Postboten verwende, wird es am Ende zeigt mir die Werte, die wir in unserem Konstruktor deklariert. – Chip

Antwort

1

Weil MessageService jede Anfrage erstellt wird, die den Konstruktor in Ressourcen aufruft.

Wenn Sie eine neue Nachricht mit POST und DELETE erstellen, funktioniert das Gleiche.

+0

Wie können wir das vermeiden? Ich habe das gleiche wie oben mit Post und Update auch festgestellt. Gibt es eine Möglichkeit, die aktualisierten Ergebnisse mithilfe der get-Methode zu sehen? Jedes Mal, wenn ich Postbote benutze, wird es am Ende dieselben 2 Ergebnisse anzeigen, die im Konstruktor deklariert sind. – Chip

Verwandte Themen