DELETE方法将无法正确删除实体

时间:2016-07-15 10:49:42

标签: java json rest jersey jax-rs

我正在尝试通过POST请求删除使用JSON获得的对象。然后通过使用对象id,我想使用DELETE请求删除它。 DELETE请求以204 No Content回复。

这一切都很好但是当我使用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。无论哪种方式,配置文件都会被成功删除。

1 个答案:

答案 0 :(得分:1)

因为每次在资源中调用构造函数的请求都会创建MessageService

private MessageService mService = new MessageService();

如果使用POST和DELETE创建新邮件,则同样可以。