微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Spring Boot:POST提交将空值保存在数据库中

如何解决Spring Boot:POST提交将空值保存在数据库中

我正在使用Spring构建简单的CRUD示例。 我有两个实体(Project)和(ProjectExpenditure),它们具有M:1关系。 我的问题是“当我通过POST提交ProjectExpenditure时,将保存null(对于type =“ text”)和0(对于type =“ number”),而不是发送真实数据。

实体1-项目

@Entity
@Getter @Setter
@Table(name = "projects")
public class Project  {     
    @Id
    @GeneratedValue (strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private int budget; 
        
        
    // Business Logic:  Adding Expenditure will minus Project budget 
    public void minusBudget(int expenditure) {
        int leftBudget = this.budget -= expenditure;
        
        if(leftBudget <= 0) {
            throw new NotEnoughBudgetException ("Budget is not enough");
        }
    
        this.budget = leftBudget;
    } 
}

实体2-ProjectExpenditure

@Entity
@Getter @Setter
@requiredArgsConstructor
@Table(name = "project_expenditure")
public class ProjectExpenditure{
    @Id
    @GeneratedValue (strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne (fetch = FetchType.LAZY)
    @JoinColumn(name = "project_id")
    private Project project;

    private int cost;

    private String description;

    
    
    // Add Expenditure: Adding Expenditure will minus Project budget 
    public ProjectExpenditure createExpenditure (Project project,int cost,String description) {
        ProjectExpenditure expenditure = new ProjectExpenditure();
        
        expenditure.setProject(project);
        expenditure.setCost(cost);
        expenditure.setDescription(description);
        
        project.minusBudget(cost);  
    
        return expenditure;
    }
}

存储库

@RepositoryRestResource
public interface ProjectRepository extends CrudRepository<Project,Long> { }
 
@RepositoryRestResource
public interface ProjectExpenditureRepository extends CrudRepository<ProjectExpenditure,Long> { } 

服务

@Service
@Transactional(readOnly = true)
@requiredArgsConstructor
public class ProjectExpenditureService {

    private final ProjectRepository pRepository;
    private final ProjectExpenditureRepository peRepository;
    
    /*
     * Add Expenditure
     */
    @Transactional
    public Long addExpenditure (Long projectId,String description) {
        
        // Create ProjectExpenditure
        ProjectExpenditure projectExpenditure = new ProjectExpenditure();
        pRepository.findById(projectId).ifPresent(p -> projectExpenditure.createExpenditure(p,cost,description));
    
        
        // Save ProjectExpenditure
        peRepository.save(projectExpenditure);
        
        return projectExpenditure.getId();
    
    }
}

控制器

@Controller
@requiredArgsConstructor
public class ProjectExpenditureController {

    private final ProjectRepository pRepository;
    private final ProjectExpenditureRepository peRepository;
    private final ProjectExpenditureService service; 

    // Add Expenditure
    @GetMapping(value = "expenditureadd/{id}")
    public String addExpenditure(@PathVariable("id") Long projectId,Model model) {
        
        ProjectExpenditure expenditure = new ProjectExpenditure();
        pRepository.findById(projectId).ifPresent(p -> expenditure.setProject(p));
        model.addAttribute("expenditure",expenditure);
        
        return "expenditure/addexpenditure";
    }

    @PostMapping(value = "/expenditureadd/{id}")
    public String expendtirueSubmit(@PathVariable("id") Long project_Id,@RequestParam("project.id") Long projectId,@RequestParam("cost") int cost,@RequestParam("description") String description,Model model) {
    
        service.addExpenditure(projectId,description);       
        return "redirect:/expendituretlist/{id}";
    }
}

查看-增加支出

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org"
      xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity5">
<head>
<title>Project Management</title>
<Meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link type="text/css" rel="stylesheet" href="css/bootstrap.min.css"
      th:href="@{/css/bootstrap.min.css}" />
</head>

<body style="margin: 15px;">
<div class="container">
        <div th:replace="fragments/title :: title" />

        <div class="form-group">
        <form  class="form-horizontal" th:action="@{/expenditureadd/__${id}__}" th:object="${expenditure}" method="post">
        
        <input type="hidden" id="projectId" th:field="*{project.id}" /> <br>
    
        <label for="expenditure" class="control-label col-sm-2">Expenditure</label> 
        <input type="number" id="cost" th:field="*{cost}" class="form-control" /> 
        <br> 
        
        <label for="description" class="control-label col-sm-2">Description</label>
        <input type="text" id="description" th:field="*{description}" class="form-control"/> <br>       
        
        
        <input type ="submit" class="btn btn-success" value="Submit"/>
    </form>
    </div>
        <div th:replace="fragments/footer :: footer" />
    </div>
</body>
</html>

提交新的支出后,数据库更新如下:

id |费用|说明| project_id

1 | 0 |空|空

映射是否存在问题?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。