Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用spring数据更新对象_Java_Spring_Mongodb_Spring Boot_Spring Data - Fatal编程技术网

Java 如何使用spring数据更新对象

Java 如何使用spring数据更新对象,java,spring,mongodb,spring-boot,spring-data,Java,Spring,Mongodb,Spring Boot,Spring Data,我正在制作一个todo应用程序,每当我试图使用put更新一个对象时,它都会创建一个全新的对象并存储它 这是我的控制器: package com.todo.example.todoexample.controllers; import com.todo.example.todoexample.models.Task; import com.todo.example.todoexample.repositories.TaskRepository; import org.spring

我正在制作一个todo应用程序,每当我试图使用put更新一个对象时,它都会创建一个全新的对象并存储它

这是我的控制器:

        package com.todo.example.todoexample.controllers;

import com.todo.example.todoexample.models.Task;
import com.todo.example.todoexample.repositories.TaskRepository;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.List;

@RestController
public class TaskController {

    private TaskRepository taskRepository;

    public TaskController(TaskRepository taskRepository) {
        this.taskRepository = taskRepository;
    }

    @PostMapping(
            path = "/create",
            consumes = {
                    MediaType.APPLICATION_XML_VALUE,
                    MediaType.APPLICATION_JSON_VALUE
            },
            produces = {
                    MediaType.APPLICATION_XML_VALUE,
                    MediaType.APPLICATION_JSON_VALUE
            }
    )
    public void createTask(@Valid @RequestBody Task task) {
        task.setTitle(task.getTitle());
        task.setMessage(task.getMessage());

        taskRepository.save(task);
    }

    @DeleteMapping("/{id}")
    public ResponseEntity<Void> deleteTask(@PathVariable String id) {
        taskRepository.deleteById(id);

        return ResponseEntity.noContent().build();
    }

    @RequestMapping("/")
    public List<Task> getAllTasks() {
        return taskRepository.findAll();
    }

   /* @PutMapping(
            path = "/create/{id}",
            consumes = {
                    MediaType.APPLICATION_XML_VALUE,
                    MediaType.APPLICATION_JSON_VALUE
            },
            produces = {
                    MediaType.APPLICATION_XML_VALUE,
                    MediaType.APPLICATION_JSON_VALUE
            }
    )
    public void updateTask(@PathVariable String id, @Valid @RequestBody Task task) {
        taskRepository.findById(id);
        task.setTitle(task.getTitle());
        task.setMessage(task.getMessage());

        taskRepository.save(task);


    }*/
}
package com.todo.example.todoexample.controllers;
导入com.todo.example.todoexample.models.Task;
导入com.todo.example.todoexample.repositories.TaskRepository;
导入org.springframework.http.MediaType;
导入org.springframework.http.ResponseEntity;
导入org.springframework.web.bind.annotation.*;
导入javax.validation.Valid;
导入java.util.List;
@RestController
公共类任务控制器{
专用任务库任务库;
公共TaskController(TaskRepository TaskRepository){
this.taskRepository=taskRepository;
}
@邮戳(
path=“/create”,
消耗={
MediaType.APPLICATION\u XML\u值,
MediaType.APPLICATION_JSON_值
},
生产={
MediaType.APPLICATION\u XML\u值,
MediaType.APPLICATION_JSON_值
}
)
public void createTask(@Valid@RequestBody Task Task){
task.setTitle(task.getTitle());
task.setMessage(task.getMessage());
taskRepository.save(任务);
}
@DeleteMapping(“/{id}”)
公共响应属性deleteTask(@PathVariable字符串id){
taskRepository.deleteById(id);
返回ResponseEntity.noContent().build();
}
@请求映射(“/”)
公共列表getAllTasks(){
返回taskRepository.findAll();
}
/*@PutMapping(
path=“/create/{id}”,
消耗={
MediaType.APPLICATION\u XML\u值,
MediaType.APPLICATION_JSON_值
},
生产={
MediaType.APPLICATION\u XML\u值,
MediaType.APPLICATION_JSON_值
}
)
public void updateTask(@PathVariable字符串id,@Valid@RequestBody任务){
taskRepository.findById(id);
task.setTitle(task.getTitle());
task.setMessage(task.getMessage());
taskRepository.save(任务);
}*/
}
我曾尝试使用mongotemplate,但它并没有真正起作用,我相信这是因为我每次都尝试接收一个新对象并存储它。但是,我不确定将任务存储在哪个对象上。因为我相信我需要findById,存储该变量,然后设置标题和消息,然后保存它!
唯一的问题是,我不知道使用什么对象。任何帮助都很好

您名为
task
的变量声明如下:

公共地图任务

这意味着它实际上是一个
null
Map对象。在它上调用
get
,就是您获得NPE的原因


正确初始化
任务
映射,或者更改实现以从数据库中获取
任务
对象(使用相关存储库)——这似乎是正确的做法。

对此的答案是updateTask可能为空,因此在失败时需要进行验证

以下是更新后的方法,现在一切正常:

 public void updateTask(@PathVariable String id, @Valid @RequestBody Task task) {
    Task updatedTask = taskRepository.findById(id).orElse(null);
    assert updatedTask != null;
    updatedTask.setTitle(task.getTitle());
    updatedTask.setMessage(task.getMessage());

    taskRepository.save(updatedTask);
}

你能在post中添加代码而不是imagesHi吗?它能不能是
Task storedTask=Task.get(id)行中的storedTask是否为空?如果可以让taskRepository跟踪任务,为什么要在控制器中保留包含任务的映射?我已将更新任务更改为停止使用映射并使用repo,我不确定将其设置为什么变量,也不确定如何在我的控制器中执行此操作。我已尝试使用map来获取任务,然后更新set消息和set title。如果我要使用repo,id findById,那么我会将其设置为一个变量并以某种方式更新消息和标题吗?似乎您缺乏基本的OOP原则。这里的想法是从数据库中检索
任务
对象,在其上设置新值(通过setters),然后通过
存储库#update
更新数据库中的对象。这就是这件事的全部要点。嗨,我算出了,实际上是因为updatetask可以为null,所以它需要捕捉那个错误!