kotlin @Requestbody包含编号初始化为0的对象列表

oyjwcjzk  于 2022-11-25  发布在  Kotlin
关注(0)|答案(3)|浏览(221)

在@PostMapping调用中,当通过@RequestBody接收到一个对象列表,并且该列表包含Int或Double变量时,如果这些变量没有在请求主体json中发送,则这些变量将自初始化为0。相反,我理解它应该返回错误的请求
例如,使用BigDecimal时不会发生此问题,并且返回带有此变量的错误请求,或者如果请求的主体是对象而不是列表,则不会发生此问题。
你知道怎么解决这个吗?是Spring问题吗?
重现问题的示例:

data class Animal(
    val name: String,
    val height: Double
)

@PostMapping("/animals")
suspend fun saveAnimals(
    @RequestBody request: List<Animal>
): ResponseEntity<Any> {
    println(request[0].height)
    return ResponseEntity.ok().build()
}

在上面的例子中,如果请求中没有发送高度,打印结果将为0,但我希望这会返回一个错误的请求。

twh00eeo

twh00eeo1#

必须将DTO声明为

data class Animal(
    val name: String,
    val height: Double?  // <-----see the ?
)

val height: DoubleJVM中被转换成基元double,如果没有定义基元0.0,则基元double具有初始值。
然而,val height: Double?JVM中被翻译成装箱类型Double,如果null未被定义,则装箱类型Double具有初始值。

2skhul33

2skhul332#

因为Kotlin不像Java那样使用原语和 Package 对象。intInteger在Java中。如果Kotlin可以优化,那么它会这样做。所以这个Double在编译版本中将是double。Ofc,如果你调用 Package 器方法,使用任何遗传(例如List),或者属性在你的代码中是nullable类型,Kotlin不会改变为原始double。
总之:基元双精度浮点数的默认值为0.0
来自data class Animal的IDEA Java代码示例:

// Animal.java
package com.example.demo2;

import kotlin.Metadata;
import kotlin.jvm.internal.Intrinsics;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

@Metadata(
   mv = {1, 6, 0},
   k = 1,
   d1 = {"\u0000(\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0000\n\u0002\u0010\u000e\n\u0000\n\u0002\u0010\u0006\n\u0002\b\t\n\u0002\u0010\u000b\n\u0002\b\u0002\n\u0002\u0010\b\n\u0002\b\u0002\b\u0086\b\u0018\u00002\u00020\u0001B\u0015\u0012\u0006\u0010\u0002\u001a\u00020\u0003\u0012\u0006\u0010\u0004\u001a\u00020\u0005¢\u0006\u0002\u0010\u0006J\t\u0010\u000b\u001a\u00020\u0003HÆ\u0003J\t\u0010\f\u001a\u00020\u0005HÆ\u0003J\u001d\u0010\r\u001a\u00020\u00002\b\b\u0002\u0010\u0002\u001a\u00020\u00032\b\b\u0002\u0010\u0004\u001a\u00020\u0005HÆ\u0001J\u0013\u0010\u000e\u001a\u00020\u000f2\b\u0010\u0010\u001a\u0004\u0018\u00010\u0001HÖ\u0003J\t\u0010\u0011\u001a\u00020\u0012HÖ\u0001J\t\u0010\u0013\u001a\u00020\u0003HÖ\u0001R\u0011\u0010\u0004\u001a\u00020\u0005¢\u0006\b\n\u0000\u001a\u0004\b\u0007\u0010\bR\u0011\u0010\u0002\u001a\u00020\u0003¢\u0006\b\n\u0000\u001a\u0004\b\t\u0010\n¨\u0006\u0014"},
   d2 = {"Lcom/example/demo2/Animal;", "", "name", "", "height", "", "(Ljava/lang/String;D)V", "getHeight", "()D", "getName", "()Ljava/lang/String;", "component1", "component2", "copy", "equals", "", "other", "hashCode", "", "toString", "demo2"}
)
public final class Animal {
   @NotNull
   private final String name;
   private final double height;

   @NotNull
   public final String getName() {
      return this.name;
   }

   public final double getHeight() {
      return this.height;
   }

   public Animal(@NotNull String name, double height) {
      Intrinsics.checkNotNullParameter(name, "name");
      super();
      this.name = name;
      this.height = height;
   }

   @NotNull
   public final String component1() {
      return this.name;
   }

   public final double component2() {
      return this.height;
   }

   @NotNull
   public final Animal copy(@NotNull String name, double height) {
      Intrinsics.checkNotNullParameter(name, "name");
      return new Animal(name, height);
   }

   // $FF: synthetic method
   public static Animal copy$default(Animal var0, String var1, double var2, int var4, Object var5) {
      if ((var4 & 1) != 0) {
         var1 = var0.name;
      }

      if ((var4 & 2) != 0) {
         var2 = var0.height;
      }

      return var0.copy(var1, var2);
   }

   @NotNull
   public String toString() {
      return "Animal(name=" + this.name + ", height=" + this.height + ")";
   }

   public int hashCode() {
      String var10000 = this.name;
      return (var10000 != null ? var10000.hashCode() : 0) * 31 + Double.hashCode(this.height);
   }

   public boolean equals(@Nullable Object var1) {
      if (this != var1) {
         if (var1 instanceof Animal) {
            Animal var2 = (Animal)var1;
            if (Intrinsics.areEqual(this.name, var2.name) && Double.compare(this.height, var2.height) == 0) {
               return true;
            }
         }

         return false;
      } else {
         return true;
      }
   }
}
tct7dpnv

tct7dpnv3#

除了我的另一个答案,另一个概念:

为什么不通过列表进行验证:https://stackoverflow.com/a/35643761/2625393
使用以下内容:
第一个

相关问题