如何使PUT方法起作用?我想更新表中的数据

时间:2018-11-09 09:06:32

标签: spring rest spring-data-jpa put

这是我的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);
    }
}

2 个答案:

答案 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) {
        // ...
    }

根据注释,将相应地调用该方法。

更多信息,请参见: SpringJAX-RS