使用PATCH方法删除列表的特定元素,该元素是另一个列表的元素.使用dropwizard编写 [英] Removing a specific element of a list which is an element of another list using PATCH method. Written using dropwizard

查看:69
本文介绍了使用PATCH方法删除列表的特定元素,该元素是另一个列表的元素.使用dropwizard编写的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试编写一个PATCH api方法,该方法从项目列表中删除一个特定的元素.请注意,项目列表是Menu类的一部分.那里没有很多dropwizard资源,所以我有点卡住了.

I'm trying to write a PATCH api method which removes one specific element from a list of items. Note that the list of items is part of the Menu class. There aren't a lot of dropwizard resources out there, so I'm kinda stuck.

这是所有重要的代码- https://pastebin.com/Y9mAVZJk

Here's all the important pieces of code – https://pastebin.com/Y9mAVZJk

任何帮助都将有很多意义.我是Restul API的初学者,但是我很容易理解Angular的概念.我在后端遇到问题,尤其是因为它是dropwizard.它必须是dropwizard,因为它是一项任务,我无法将其更改为其他任何东西.该数据库可能会在以后出现,但现在还是一样.

Any help would mean a lot. I am a beginner when it comes to restul apis, but i've grasped the concept of Angular easily. I'm having issues with the backend, especially because it is dropwizard. It has to be dropwizard as it is an assignment, I can't change it to anything else. The databse might come later, but it is as it is right now.

public class Item {

    private String person;
    private String name;
    private Integer quantity;
    private Integer price;


     public Item(String name, int price) {

        this.person = "";
        this.quantity = 0;
        this.name = name;
        this.price = price;
      }

    public Item(String person, String name, int quantity, int price) {

        this.name = name;
        this.person = person;
        this.quantity = quantity;
        this.price = price;
    }

    @JsonProperty
    public String getPerson() {
        return this.person;
    }


    @JsonProperty
    public String getName(){
        return this.name;
    }

    @JsonProperty
    public Integer getQuantity(){
        return this.quantity;
    }

    @JsonProperty
    public Integer getPrice(){
        return this.price;
    }

}
____________________________
public class Menu {

    private Integer id;
    private String name;
    private List<Item> items;

    public Menu() { }

    public Menu(int id, String name, List<Item> items) {
        this.id = id;
        this.name = name;
        this.items = items;
    }


    @JsonProperty
    public List<Item> getItems() {
        return this.items;
    }

    @JsonProperty
    public void setItems(List<Item> items){
        this.items = items;
    }

    @JsonProperty
    public Integer getId() {

        return this.id;
    }

    @JsonProperty
    public String getName() {
        return this.name;
    }

    @JsonProperty
    public void setId(final int id) {
        this.id = id;
    }

    @JsonProperty
    public void setName(final String name) {
        this.name = name;
    }
}
_____________________________

public MenuRepository() {
        this.menus = new HashMap<>();
        for (int i=1; i<9; i++) {
            Item item = new Item("Item " + i, i+200);
            this.items.add(item);
        }

        addNewMenu(new Menu(1, "First Menu", this.items));
        addNewMenu(new Menu(2, "Second Menu", this.items));
        addNewMenu(new Menu(3, "Third Menu", this.items));
        addNewMenu(new Menu(4, "Fourth Menu", this.items));
        addNewMenu(new Menu(5, "Fifth Menu", this.items));
        addNewMenu(new Menu(6, "Sixth Menu", this.items));
        addNewMenu(new Menu(7, "Seventh Menu", this.items));

    }

    private int getNewId() {
        return counter++;
    }
 public Collection<Menu> getAllMenus() {
        return this.menus.values();
    }

    public Menu get(final int id) {
        return this.menus.get(id);
    }

    public Collection<Menu> addNewMenu(final Menu menu) {

        menu.setId(this.getNewId());
        this.menus.put(menu.getId(), menu);
        return this.menus.values();

    } 

    public Collection<Menu> removeMenu(final int id) {
        this.menus.remove(id);
        return this.menus.values();
    }

@Path("/menu")
@Produces(MediaType.APPLICATION_JSON)

public class MenuResource {

    private MenuRepository menuRepository;

    public MenuResource(final MenuRepository menuRepository) {
        this.menuRepository = menuRepository;
    }

    @GET
    @Timed
    public Collection<Menu> getAll() {
        return this.menuRepository.getAllMenus();
    }

    @GET
    @Path("/{id}")
    @Timed
    public Menu get(@PathParam("id") final int id) {


        return this.menuRepository.get(id);
    }

    @POST
    @Timed
    public Collection<Menu> post(final Menu menu) {
        return this.menuRepository.addNewMenu(menu);
    }

    @DELETE
    @Path("/{id}")
    @Timed
    public Collection<Menu> delete(@PathParam("id") final int id) {
        return this.menuRepository.removeMenu(id);
    }

是否可以使用PATCH方法在列表中添加和删除项目?

Is it possible to get the PATCH method to both add and remove items from the list?

推荐答案

我正在尝试在编写此答案时理解您的代码.

I'm trying to understand your code while writing this answer.

首先,我想尝试对它进行格式化,因为格式化后的代码不仅对我们而且对您而言都更易于阅读.

I'd say, first of all, try formatting it a little bit better, as formatted code is easier to read not only for us, but for you.

如果我没记错的话,Dropwizard捆绑了Jersey,这是一个JAX-RS实现.在您的资源类中,只需使用@PATCH批注来标识项目删除方法.

If I remember correctly, Dropwizard bundles Jersey, which is a JAX-RS implementation. In your resource class, just use the @PATCH annotation to identify the item removal method.

您可以保留List<Item>并通过ListIterator<Item>删除该元素.

You can get a hold of the List<Item> and remove the element via ListIterator<Item>.

@Path("/menu")
@Produces(MediaType.APPLICATION_JSON)
public class MenuResource {
   ...

   @PATCH
   @Path("/remove/{menuId}/{itemName}")
   public void removeMenuItem(
            @PathParam("menuId") final int menuId,
            @PathParam("itemName") final String itemName) {
      final List<Item> items = this.menuRepository.get(menuId).getItems();

      for (final ListIterator<Item> iterator = items.listIterator(); iterator.hasNext();) {
         final Item item = iterator.next();

         if (itemName.equals(item.getName())) {
            iterator.remove();
            break;
         }
      }
   }

   @PATCH
   @Path("/add/{menuId}")
   public void removeMenuItem(
            @PathParam("menuId") final int menuId,
            final Item item) {  // Item represents the Request Body
      final List<Item> items = this.menuRepository.get(menuId).getItems();
      items.add(item);
   }

请记住在Item类上添加@XmlRootElement批注

Remember to add the @XmlRootElement annotation on the Item class

@XmlRootElement
public class Item { ... }


对于插入/移除点,我想说使用两种不同的方法.


For the insertion/removal point, I'd say use two different methods.

您可以在插入路径前面加上add,例如/add/{menuId}并通过请求正文传递Item. 然后,您可以为删除路径添加remove前缀,例如/remove/{menuId}/{itemId}

You can prefix the insertion path with add, e.g. /add/{menuId} and pass the Item via request body. You can then prefix the removal path with remove e.g. /remove/{menuId}/{itemId}

这篇关于使用PATCH方法删除列表的特定元素,该元素是另一个列表的元素.使用dropwizard编写的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆