无法使用 DTO 将数据保存到数据库



这个问题与前面的一个问题有关:发布数据时获取null

我尝试了一个建议的答案,导入了lombok并创建了一个DTO类,如下所示:

package com.example.dto;
import java.util.HashSet;
import java.util.Set;
import lombok.Data;
@Data
public class TownDTO {
public String name;
public String regionid;
}

城镇表与数据库中的地区表相关。当我试图保存数据时,我得到了以下异常:

not-null property references a null or transient value : com.example.model.Towns.regionid

这是我的型号

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;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "towns")
public class Towns {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
@Column(name = "name")
private String name;
@JsonIgnore
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "regionid", nullable = false)
@OnDelete(action = OnDeleteAction.CASCADE)
private Regions 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);
}

区域存储库

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);
}

最后给出了控制器的方法:

@PostMapping("/add")
public ResponseEntity<TownDTO> createPost(@RequestBody TownDTO townDto) {

// convert DTO to entity
Towns townRequest = modelMapper.map(townDto, Towns.class);
//System.out.println(townDto.regionid);
//System.out.println(townRequest.getName());
Towns town = townsrepository.save(townRequest);

// convert entity to DTO
TownDTO townResponse = modelMapper.map(town, TownDTO.class);
return new ResponseEntity<TownDTO>(townResponse, HttpStatus.CREATED);
}

我可以打印出townDTO.regionid,在我的情况下,值是正确的2。但请求仍然为空。这是邮递员的请求

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

我现在缺少什么?

删除@jsonignore并将getter和setter添加到DTO

package com.example.dto;
import java.util.HashSet;
import java.util.Set;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
@Data
public class TownDTO {
public String name;
public String regionid;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getRegionid() {
return regionid;
}
public void setRegionid(String regionid) {
this.regionid = regionid;
}


}

没有什么变化。错误是相同的

TownDTO包含String regionid,而Model类是Region Object。所以moddlemapper无法映射。

//DTO
public String regionid;
//Model
private Regions regionid;

最新更新