【发布时间】:2021-06-21 10:42:26
【问题描述】:
不确定我是不是发疯了,但我设置了一个非常简单的 POST 映射来接收数据类型为字符串和布尔值的 JSON 响应。由于某种原因,该方法正在更改我的字段名称,并且它也无法解析 2 个布尔变量和 一些 字符串变量的值。
注意事项:
- 我在同一个项目中的另一个实体/控制器/存储库(访问者类)中使用布尔和字符串/数字数据类型进行了测试,它可以正常工作。
- 提交到数据库的数据已经是错误的(因此返回响应是错误的),所以我认为最初解析来自 ResponseEntity 的数据是问题所在。
- 我尝试在我的表架构中同时使用 BIT 和 BOOLEAN,但两者结果相同。
提前感谢您的任何反馈!
实体
package com.vmsac.vmsacserver.model;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Data
@Table(name="scheduledvisit")
public class ScheduledVisit {
@Id
@GeneratedValue (strategy = GenerationType.IDENTITY)
@Column(name="scheduledvisitid")
private Long scheduledVisitId;
@Column(name="visitorid")
private Long visitorId;
@Column(name="startdateofvisit")
private String startDateofVisit;
@Column(name="enddateofvisit")
private String endDateofVisit;
@Column(name="qrcodeid")
private Long qrCodeId;
@Column(name="isvalid")
private boolean isValid;
@Column(name="isonetimeuse")
private boolean isOneTimeUse;
@Column(name="raisedby")
private Long raisedBy;
}
控制器
package com.vmsac.vmsacserver.controller;
import com.vmsac.vmsacserver.model.ScheduledVisit;
import com.vmsac.vmsacserver.repository.ScheduledVisitRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.util.List;
import java.net.URI;
import java.net.URISyntaxException;
@RestController
@RequestMapping("/api")
public class ScheduledVisitController{
@Autowired
private ScheduledVisitRepository scheduledVisitRepository;
@GetMapping(path = "/scheduled-visits")
List<ScheduledVisit> getScheduledVisits(){
return scheduledVisitRepository.findAll();
}
@PostMapping(path = "/register-scheduled-visit", consumes = "application/json")
ResponseEntity<ScheduledVisit> createScheduledVisit(@Valid @RequestBody ScheduledVisit scheduledVisit) throws URISyntaxException{
ScheduledVisit registeredVisit = scheduledVisitRepository.save(scheduledVisit);
return ResponseEntity.created(new URI("/api/register-scheduled-visit" + registeredVisit.getScheduledVisitId())).body(registeredVisit);
}
}
存储库
package com.vmsac.vmsacserver.repository;
import com.vmsac.vmsacserver.model.ScheduledVisit;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
public interface ScheduledVisitRepository extends JpaRepository<ScheduledVisit, Long> {
List<ScheduledVisit> findByScheduledVisitId(String scheduledVisitId);
}
JSON 对象(使用 Postman)
{
"visitorId" : 456879,
"startDateOfVisit" : "10Jan2021",
"endDateOfVisit" : "12-Jan-2021",
"qrCodeId" : 12325,
"isValid" : true,
"isOneTimeUse" : false,
"raisedBy" : 123456
}
回应
{
"scheduledVisitId": 3,
"visitorId": 456879,
"startDateofVisit": null, //this string returns null, should have a value
"endDateofVisit": null, //this string returns null, should have a value
"qrCodeId": 12325,
"raisedBy": 123456,
"valid": false, //field name should be isValid, value should be true
"oneTimeUse": false //field name should be isOneTimeUse
}
数据库架构
CREATE TABLE ScheduledVisit (
scheduledVisitId BIGINT NOT NULL AUTO_INCREMENT,
visitorId BIGINT,
startDateOfVisit VARCHAR(128),
endDateOfVisit VARCHAR(128),
qrCodeId BIGINT,
isValid BIT,
isOneTimeUse BIT,
raisedBy BIGINT,
PRIMARY KEY (scheduledVisitId)
);
【问题讨论】:
-
简单的建议,为了让您的实体更具可读性,您可以在每个语句后添加一个空行,这意味着每个
;后的空行。这在阅读时会很清楚,因为相关的字段和注释可以作为一个组来阅读。 -
我也可以推荐使用 dto 而不是直接暴露你的实体。然后您可以灵活地选择要显示的字段等。如果您使用 dto,另一个有用的注释是
@Jacksonized与@Builder的组合。你需要像 MapStruct 这样的想法来将你的 dto 映射到实体。但请仅将其视为与您的实际问题无关的建议。