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.
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
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