发布数据时为空为空、数据

2023-09-07 11:14:41 作者:谁╰許我壹世繁華

我正在使用邮递员来处理 spring boot api.目前我正在尝试将数据添加到相关表中.其中有2个地区和城镇.城镇有一个 regionid 列.这是我的要求.

I am using a postman to work with spring boot api. Currently I am trying to add data to a related table. There are 2 of them regions and towns. Towns has a regionid column. Here is my request.

{
"name": "test",
"regionid":"2"
}

虽然名称发布得很好,但区域 ID 为空.我正在尝试在控制器中打印出来.这是它的保存数据方法:

While name is posting just fine, region id is null. I am trying to print it out in a controller. Here is a save data method of it:

@PostMapping("/add")
    public ResponseEntity<Towns> createtown(@RequestBody Towns town) {
      try {
            
          Towns _town = townsrepository
            .save(new Towns( town.getName(), town.getRegionid()));
        return new ResponseEntity<>(_town, HttpStatus.CREATED);
      } catch (Exception e) {
       System.out.println(e.getMessage());
        System.out.println("region");
        System.out.println(town.getRegionid());
    
        return new ResponseEntity<>(null, HttpStatus.INTERNAL_SERVER_ERROR);
      }
    }

我遇到了异常,在打印 town.getName() 时我得到了测试.但是,当我尝试打印出 town.getRegionId() 时,我得到了空值.这是我的模型类

I am getting the exception and while I am printing town.getName() I get test. But while I try to print out town.getRegionId() I get null. Here is my model class

package com.example.model;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

import org.hibernate.annotations.OnDelete;
import org.hibernate.annotations.OnDeleteAction;
@Entity
@Table(name = "towns")

public class Towns {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;
    @Column(name = "name")
    private String name;
     @ManyToOne(fetch = FetchType.LAZY, optional = false)
        @JoinColumn(name = "regionid", nullable = false)
        @OnDelete(action = OnDeleteAction.CASCADE)
        private Regions regionid;
    
    public Towns() {

    }
    public Towns(String name,Regions regionid) {
    //  super();
        this.id=id;
        this.name = name;
        this.regionid=regionid;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        
        this.name = name;
    }
    public Regions getRegionid() {
        return regionid;
    }
    public void setRegionid(Regions regionid) {
        this.regionid = regionid;
    }
    
}

还有存储库:

package com.example.repository;
import java.util.List;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.Optional;

import com.example.model.Towns;
import com.example.model.Regions;
public interface TownsRepository extends JpaRepository<Towns, Integer> {

     List<Towns> findByNameContaining(String name);
     Page<Regions> findByregionid(Integer regionid, Pageable pageable);
        Optional<Regions> findByregionidAndId(Integer regionId, Integer id);

}

还有 Application.properties 以防万一

And Application.properties in case it will help

spring.datasource.url= jdbc:mysql://localhost:3306/appartmentbuilderbase?useSSL=false
spring.datasource.username= root
spring.datasource.password=
spring.jpa.properties.hibernate.dialect= org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.hibernate.ddl-auto= update

我在这里做错了什么?

尝试按照建议进行:

Towns _town = townsrepository .save(new Towns( town.getName(), regionsrepository.findById(town.getRegionid())));

得到了这些错误:

Description Resource    Path    Location    Type
The constructor Towns(String, Optional<Regions>) is undefined   TownsController.java    /apartmentbuilders/src/main/java/com/example/controller line 71 Java Problem

还有这个:

Description Resource    Path    Location    Type
The method save(S) in the type CrudRepository<Towns,Integer> is not applicable for the arguments (Towns)    TownsController.java    /apartmentbuilders/src/main/java/com/example/controller line 71 Java Problem

添加完整的控制器代码

package com.example.controller;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.example.model.Towns;
import com.example.repository.TownsRepository;
import com.example.repository.RegionsRepository;
@CrossOrigin(origins = "http://localhost:8081")

@RestController
@RequestMapping("/towns")

public class TownsController {

    @Autowired
    TownsRepository townsrepository;
    @Autowired
    RegionsRepository regionsrepository;
    @GetMapping("/list")
    public ResponseEntity<List<Towns>> getAllTowns(@RequestParam(required = false) String name) {
      try {
        List<Towns> towns = new ArrayList<Towns>();

        if (name == null)
          townsrepository.findAll().forEach(towns::add);
        else
          townsrepository.findByNameContaining(name).forEach(towns::add);

        if (towns.isEmpty()) {
          return new ResponseEntity<>(HttpStatus.NO_CONTENT);
        }

        return new ResponseEntity<>(towns, HttpStatus.OK);
      } catch (Exception e) {
        return new ResponseEntity<>(null, HttpStatus.INTERNAL_SERVER_ERROR);
      }
    }
    
    @GetMapping("/list/{id}")
    public ResponseEntity<Towns> getTownById(@PathVariable("id") int id) {
      Optional<Towns> townData = townsrepository.findById(id);

      if (townData.isPresent()) {
        return new ResponseEntity<>(townData.get(), HttpStatus.OK);
      } else {
        return new ResponseEntity<>(HttpStatus.NOT_FOUND);
      }
    }

    @PostMapping("/add")
    public ResponseEntity<Towns> createtown(@RequestBody Towns town) {
      try {
            
          Towns _town = townsrepository
            .save(new Towns( town.getName(), town.getRegionid()));
         // Towns _town = townsrepository .save(new Towns( town.getName(), regionsrepository.findByRegionId(town.getRegionid())));
          return new ResponseEntity<>(_town, HttpStatus.CREATED);
      } catch (Exception e) {
       System.out.println(e.getMessage());
        System.out.println("region");
        System.out.println(town.getRegionid());
    
        return new ResponseEntity<>(null, HttpStatus.INTERNAL_SERVER_ERROR);
      }
    }
    
    @PutMapping("/edit/{id}")
    public ResponseEntity<Towns> updateTown(@PathVariable("id") int id, @RequestBody Towns town) {
      Optional<Towns> townData = townsrepository.findById(id);

      if (townData.isPresent()) {
        Towns _town = townData.get();
        _town.setName(town.getName());
        _town.setRegionid(town.getRegionid());
        return new ResponseEntity<>(townsrepository.save(_town), HttpStatus.OK);
      } else {
        return new ResponseEntity<>(HttpStatus.NOT_FOUND);
      }
    }
    
    @DeleteMapping("/delete/{id}")
    public ResponseEntity<HttpStatus> deleteTown(@PathVariable("id") int id) {
      try {
        townsrepository.deleteById(id);
        return new ResponseEntity<>(HttpStatus.NO_CONTENT);
      } catch (Exception e) {
        return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
      }
    }
}
     

添加区域存储库

package com.example.repository;
import java.util.List;

import org.springframework.data.jpa.repository.JpaRepository;
import com.example.model.Regions;

public interface RegionsRepository extends JpaRepository<Regions, Integer> {

      List<Regions> findByNameContaining(String name);

}

推荐答案

你缺少一个 DTO 类.不要直接将 DB 实体类映射到请求正文.有一个类似的课程

You are missing a DTO class. Don't directly map DB entity class to request body. have a class like

@Data
public class TownDTO {
   private String name;
   private String regionid;
}

同样在保存时,通过存储库获取区域:

also when saving, get the region through a repository:

Towns _town = townsrepository
  .save(new Towns( town.getName(), regionRepository.findByRegionId(town.regionId)));

所以在控制器中:

@PostMapping("/add")
public ResponseEntity<Towns> createtown(@RequestBody Town town) {
  try {
        
      Towns _town = townsrepository
        .save(new Towns( town.getName(), regionRepository.findByRegionId(town.regionId)));
    return new ResponseEntity<>(_town, HttpStatus.CREATED);
  } catch (Exception e) {
   System.out.println(e.getMessage());
    System.out.println("region");
    System.out.println(town.getRegionid());

    return new ResponseEntity<>(null, HttpStatus.INTERNAL_SERVER_ERROR);
  }
}