这是我的POST方法,成功并且运行良好。我的问题是如何执行PUT请求方法,以便它可以很好地更新数据?
public void addRecipe(RecipeDTO recipedto)
{
Category categoryTitle = categoryRepository.findByCategoryTitle(recipedto.getCategoryTitle());
Recipe recipe = new Recipe();
/*I map my dto data original model*/
recipe.setRID(recipedto.getrID());
recipe.setRecipeTitle(recipedto.getRecipeTitle());
recipe.setDescription(recipedto.getDescription());
recipe.setCookTime(recipedto.getCookTime());
List categoryList = new ArrayList<>();
categoryList.add(categoryTitle);
recipe.setCategories(categoryList);
Recipe savedRecipe = recipeRepository.save(recipe);
/*I map the data in ingredientDTO and setpDTO to actual model */
List ingredientList = new ArrayList<>();
for(IngredientDTO ingredientdto : recipedto.getIngredients())
{
Ingredient ingredient = new Ingredient();
ingredient.setIID(ingredientdto.getiID());
ingredient.setIngredientName(ingredientdto.getIngredientName());
ingredient.setRecipe(savedRecipe);
ingredientList.add(ingredient);
}
List stepList = new ArrayList<>();
for(StepDTO stepdto : recipedto.getSteps())
{
Step step = new Step();
step.setSID(stepdto.getsID());
step.setStepDescription(stepdto.getStepDescription());
step.setStepNumber(stepdto.getStepNumber());
step.setRecipe(savedRecipe);
stepList.add(step);
}
ingredientRepository.save(ingredientList);
stepRepository.save(stepList);
}
这是我的put方法,它不起作用,应该怎么做,因为我不知道。如果更好的话,请教我做这种方法。
public void updateRecipe(RecipeDTO recipedto, String id)
{
Recipe recipe = recipeRepository.findByrID(recipedto.getrID());
if(id==recipedto.getrID().toString())
{
recipeRepository.save(recipe);
}
}
答案 0 :(得分:0)
在用Java构建REST服务时,通常使用框架来帮助您。
像“ jax-rs”一样:https://mvnrepository.com/artifact/javax.ws.rs/javax.ws.rs-api/2.0 如果使用jax-rs,则将您的方法标记为带有@PUT注释的Http PUT方法,例如:
@PUT
@Path("ex/foo")
public Response somePutMethod() {
return Response.ok().entity("Put some Foos!").build();
}
如果使用Spring作为框架,请使用@RequestMapping批注标记您的PUT方法,例如:
@RequestMapping(value = "/ex/foo", method = PUT)
public String putFoos() {
return "Put some Foos";
}
答案 1 :(得分:0)
首先也是非常重要的一点,您请勿使用String == String来检查相等性。您的代码:
public void updateRecipe(RecipeDTO recipedto, String id)
{
Recipe recipe = recipeRepository.findByrID(recipedto.getrID());
if(id==recipedto.getrID().toString())
{
recipeRepository.save(recipe);
}
}
应该是:
public void updateRecipe(RecipeDTO recipedto, String id)
{
Recipe recipe = recipeRepository.findByrID(recipedto.getrID());
if(recipedto.getrID().toString().equals(id))
{
recipeRepository.save(recipe);
}
}
为什么? 因为与==相等将检查对象是否具有相同的内存地址。换句话说:
new Integer(1) == new Integer(1) //false
1 == 1 //true
new String("hello") == new String("hello") //false
"hello" == "hello" //true because literal strings are stored in a String pool
new String("hello") == "hello" //false
其次,您始终应该将泛型与Collection API结合使用。 您的代码:
List categoryList = new ArrayList<>();
应该是:
List<Category> categoryList = new ArrayList<>();
最后,就像askepan所说的那样,您尚未定义正在使用的框架。对于Jersey(JAX-RS实现),您可以使用HTTP请求方法: @ GET,@ POST,@ PUT,@ DELETE,@ HEAD,@ OPTIONS。
@PUT
@Produces("text/plain")
@Consumes("text/plain")
public Response putContainer() {
System.out.println("PUT CONTAINER " + container);
URI uri = uriInfo.getAbsolutePath();
Container c = new Container(container, uri.toString());
Response r;
if (!MemoryStore.MS.hasContainer(c)) {
r = Response.created(uri).build();
} else {
r = Response.noContent().build();
}
MemoryStore.MS.createContainer(c);
return r;
}
如果使用Spring,则有@RequestMapping(method =)或简称: @ GetMapping,@ PutMapping,@ PostMapping,@ DeleteMapping。
@GetMapping("/{id}")
public Person getPerson(@PathVariable Long id) {
// ...
}
@PutMapping
public void add(@RequestBody Person person) {
// ...
}
根据注释,将相应地调用该方法。