Java 如何使用spring数据更新对象
我正在制作一个todo应用程序,每当我试图使用put更新一个对象时,它都会创建一个全新的对象并存储它 这是我的控制器: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
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,所以它需要捕捉那个错误!