使用 PATCH 方法删除一个列表的特定元素,该元素是另一个列表的元素。使用 dropwizard 编写
Removing a specific element of a list which is an element of another list using PATCH method. Written using dropwizard
我正在尝试编写一个 PATCH api 方法,该方法从项目列表中删除一个特定元素。请注意,项目列表是菜单 class 的一部分。那里没有很多 dropwizard 资源,所以我有点卡住了。
这是所有重要的代码片段 – https://pastebin.com/Y9mAVZJk
任何帮助都意义重大。我是 restul apis 的初学者,但我很容易掌握 Angular 的概念。我在后端遇到问题,特别是因为它是 dropwizard。它必须是 dropwizard,因为它是一项任务,我无法将其更改为其他任何内容。数据库可能会稍后出现,但现在是这样。
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 方法在列表中添加和删除项目?
我在写这个答案的时候试图理解你的代码。
我想说的是,首先,请尝试将其格式化得更好一些,因为经过格式化的代码不仅对我们而且对您来说都更容易阅读。
如果我没记错的话,Dropwizard
捆绑了 Jersey
,这是一个 JAX-RS
实现。在您的资源 class 中,只需使用 @PATCH
注释来标识项目删除方法。
您可以获取 List<Item>
并通过 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);
}
记得在项目上添加@XmlRootElement
注释class
@XmlRootElement
public class Item { ... }
对于 insertion/removal 点,我会说使用两种不同的方法。
您可以在插入路径前加上add
,例如/add/{menuId}
并通过请求正文传递 Item
。
然后,您可以在移除路径前加上 remove
前缀,例如/remove/{menuId}/{itemId}
我正在尝试编写一个 PATCH api 方法,该方法从项目列表中删除一个特定元素。请注意,项目列表是菜单 class 的一部分。那里没有很多 dropwizard 资源,所以我有点卡住了。
这是所有重要的代码片段 – https://pastebin.com/Y9mAVZJk
任何帮助都意义重大。我是 restul apis 的初学者,但我很容易掌握 Angular 的概念。我在后端遇到问题,特别是因为它是 dropwizard。它必须是 dropwizard,因为它是一项任务,我无法将其更改为其他任何内容。数据库可能会稍后出现,但现在是这样。
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 方法在列表中添加和删除项目?
我在写这个答案的时候试图理解你的代码。
我想说的是,首先,请尝试将其格式化得更好一些,因为经过格式化的代码不仅对我们而且对您来说都更容易阅读。
如果我没记错的话,Dropwizard
捆绑了 Jersey
,这是一个 JAX-RS
实现。在您的资源 class 中,只需使用 @PATCH
注释来标识项目删除方法。
您可以获取 List<Item>
并通过 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);
}
记得在项目上添加@XmlRootElement
注释class
@XmlRootElement
public class Item { ... }
对于 insertion/removal 点,我会说使用两种不同的方法。
您可以在插入路径前加上add
,例如/add/{menuId}
并通过请求正文传递 Item
。
然后,您可以在移除路径前加上 remove
前缀,例如/remove/{menuId}/{itemId}