不要使用 Spring Boot 2.x 从 Json 转换类型布尔值
Don't work convert type boolean from Json with Srping Boot 2.x
我使用 Spring Boot 2.x 和 maven
- pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web-services</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
- json,即发送
{
"name": "fan",
"isCar": true,
"year": 2020,
"character": "W",
"cost": 10,
"status": "OPEN"
}
- DTO 的一部分
public abstract class DifferentTypesDtoFour extends DifferentTypesDtoTwo {
private Integer year;
private boolean isCar;
public DifferentTypesDtoFour() {
}
public Integer getYear() {
return year;
}
public void setYear(Integer year) {
this.year = year;
}
public boolean isCar() {
return isCar;
}
public void setCar(boolean car) {
isCar = car;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
if (!super.equals(o)) return false;
DifferentTypesDtoFour that = (DifferentTypesDtoFour) o;
return isCar == that.isCar &&
Objects.equals(year, that.year);
}
@Override
public int hashCode() {
return Objects.hash(super.hashCode(), year, isCar);
}
@Override
public String toString() {
return super.toString() + "\n" + "DifferentTypesDtoFour{" +
"year=" + year +
", isCar=" + isCar +
'}';
}
}
我无法理解这个问题的根源。
当请求到达rest controller时,dto接收到转换后的数据。
几乎数据转换正确,但字段
isCar = false...
为什么?
有人知道如何解决这个问题吗?
更新
我使用了以下内容:
public abstract class DifferentTypesDtoFour extends DifferentTypesDtoTwo {
private Integer year;
private boolean isCar;
public DifferentTypesDtoFour() {
}
public Integer getYear() {
return year;
}
public void setYear(Integer year) {
this.year = year;
}
@JsonProperty(value = "isCar")
public boolean isCar() {
return isCar;
}
@JsonProperty(value = "isCar")
public void setCar(boolean car) {
isCar = car;
}
...
}
boolean类型确实保存了,但是当数据返回到rest-controller时,client收到响应,boolean类型再次没有转换正确。
问题与您的 setter 字段有关 isCar
- setter 方法名称应该是 setIsCar
而不是 setCar
以便请求 json 的 isCar
值可以映射到模型的 isCar
属性,
public void setIsCar(boolean isCar) {
this.isCar = isCar;
}
编辑 1...
正如@Gimby 提到的,您的 getter
名称应该是 isIsCar
,它不会影响获取 HTTP 请求,但它最终看起来与该字段不匹配 getter
- 您可以考虑重新命名您的变量以避免此类错字问题。
编辑 2... 解决该问题的方法之一是使用 @JsonProperty 而不重命名 @GabLeg 提到的方法,
@JsonProperty(value="isCar")
public void setCar(boolean car) {
this.isCar = car;
}
我使用 Spring Boot 2.x 和 maven
- pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web-services</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
- json,即发送
{
"name": "fan",
"isCar": true,
"year": 2020,
"character": "W",
"cost": 10,
"status": "OPEN"
}
- DTO 的一部分
public abstract class DifferentTypesDtoFour extends DifferentTypesDtoTwo {
private Integer year;
private boolean isCar;
public DifferentTypesDtoFour() {
}
public Integer getYear() {
return year;
}
public void setYear(Integer year) {
this.year = year;
}
public boolean isCar() {
return isCar;
}
public void setCar(boolean car) {
isCar = car;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
if (!super.equals(o)) return false;
DifferentTypesDtoFour that = (DifferentTypesDtoFour) o;
return isCar == that.isCar &&
Objects.equals(year, that.year);
}
@Override
public int hashCode() {
return Objects.hash(super.hashCode(), year, isCar);
}
@Override
public String toString() {
return super.toString() + "\n" + "DifferentTypesDtoFour{" +
"year=" + year +
", isCar=" + isCar +
'}';
}
}
我无法理解这个问题的根源。
当请求到达rest controller时,dto接收到转换后的数据。
几乎数据转换正确,但字段 isCar = false...
为什么?
有人知道如何解决这个问题吗?
更新
我使用了以下内容:
public abstract class DifferentTypesDtoFour extends DifferentTypesDtoTwo {
private Integer year;
private boolean isCar;
public DifferentTypesDtoFour() {
}
public Integer getYear() {
return year;
}
public void setYear(Integer year) {
this.year = year;
}
@JsonProperty(value = "isCar")
public boolean isCar() {
return isCar;
}
@JsonProperty(value = "isCar")
public void setCar(boolean car) {
isCar = car;
}
...
}
boolean类型确实保存了,但是当数据返回到rest-controller时,client收到响应,boolean类型再次没有转换正确。
问题与您的 setter 字段有关 isCar
- setter 方法名称应该是 setIsCar
而不是 setCar
以便请求 json 的 isCar
值可以映射到模型的 isCar
属性,
public void setIsCar(boolean isCar) {
this.isCar = isCar;
}
编辑 1...
正如@Gimby 提到的,您的 getter
名称应该是 isIsCar
,它不会影响获取 HTTP 请求,但它最终看起来与该字段不匹配 getter
- 您可以考虑重新命名您的变量以避免此类错字问题。
编辑 2... 解决该问题的方法之一是使用 @JsonProperty 而不重命名 @GabLeg 提到的方法,
@JsonProperty(value="isCar")
public void setCar(boolean car) {
this.isCar = car;
}