在 spring boot 应用程序中向 mongodb 数据库发出请求后将字段设置为空

问题描述 投票:0回答:3

这是我的文档,

Employee
是 mongoDB 数据库中的一个集合

@Document(collection = "Employee")
public class Employee {
    @Id
    private String id;
    private String eId;
    private String firstName;
    private String lastName;
    private String emailId;
    private int grpId;
}

这是控制器类

@RestController
@CrossOrigin(origins = "*")
public class EmployeeController {
    @Autowired
    private EmployeeService service;
    @GetMapping("/employee")
    public ResponseEntity<?> getAllEmployee(){
        List<Employee> employees;
        employees = service.getAllEmployees();
        return new ResponseEntity<List<Employee>>(employees, HttpStatus.OK);
    }
    @PostMapping("/employee")
    public void newEmployee(@RequestBody Employee employee){
        service.newEmployee(employee);
    }
}

这是服务等级

@Service
public class EmployeeService {
    @Autowired
    private EmployeeRepository employeeRepo;
    public List<Employee> getAllEmployees(){
        return employeeRepo.findAll();
    }
    public void newEmployee(Employee employee){
        employeeRepo.save(employee);
    }
}

这是存储库界面

@Repository
public interface EmployeeRepository extends MongoRepository<Employee,String> {
}

这是我对

http://localhost:8080/employee
的发帖请求
8080
是应用程序运行的端口

{
        "eId": "01abc",
        "firstName": "your_firstName",
        "lastName": "your_lastName",
        "emailId": "[email protected]",
        "grpId": 1
}

当我使用 get 请求获取我得到的所有员工时,一旦发布请求得到满足:

{
        "id": "63f6f0ffb84be0661b8d35a0",
        "firstName": "your_firstName",
        "lastName": "your_lastName",
        "emailId": "[email protected]",
        "grpId": 1,
        "eid": null
}

如果我将

eId
传递为
null
,我无法弄清楚为什么
eId
"01abc"

我尝试为此搜索堆栈溢出但找不到解决方案

java mongodb spring-boot maven http-post
3个回答
1
投票

好的,根据您的 HTTP/POST 请求,我可以看到您并没有专门将“Id”字段作为 JSON 的一部分传递。因此,除非您以某种方式自动生成它,否则我可以提供一些提示来尝试看看有什么用:

  1. 如果 id 字段不是您的 JSON 的一部分,一旦在控制器中提取了请求主体,请尝试自动生成一个 ID。所以你的代码可能有点像
@PostMapping("/employee")
    public void newEmployee(@RequestBody Employee employee){
        employee.setId(UUID.randomUUID().toString());
        service.newEmployee(employee);
    }
  1. 它还有助于确保您所有的私有成员都有 getter 和 setter
  2. 也尝试看看你的类实现 Serializable 是这样的:
public class Employee implements Serializable
  1. 我能给出的最后建议是避免完全按照您在 HTTP/POST 请求中发送的方式存储 JSON(因为您永远不知道 JSOn 在通过网络传输到您的控制器时会发生什么)。这是您可能需要重写构造函数的地方,以便在 JSON 到达您的控制器后从中创建一个新对象。所以像这样:
@PostMapping("/employee")
    public void newEmployee(@RequestBody Employee employee){
        Employee employeeToSave = new Employee(
           UUID.randomUUID.toString(), // for the ID field,
           employee.getEId(),
           .... // fill your class up with details from the JSON
        );

        // for sanity and confirmation, you can toString() this new object to ensure it's what you want to save
        log.info("Employee to save: {}", employeeToSave.toString());
        service.newEmployee(employeeToSave);
    }

我希望这些建议之一能有所帮助:)


0
投票

使用 @Generated 将您的 id 变量类型更改为 Long 或 UUID,然后 将您的发帖请求更改为

{
    "id" : null,
    "eId": "01abc",
    "firstName": "your_firstName",
    "lastName": "your_lastName",
    "emailId": "[email protected]",
    "grpId": 1
}

0
投票

我有一个类似的问题,解决了也改变了字段的名称,你明白问题的原因了吗?在我看来是有字段名限制或与“Id”冲突

© www.soinside.com 2019 - 2024. All rights reserved.