【问题标题】:Deserialize from Number value to int (error - no int/Int-argument constructor/factory method to deserialize from Number value)从 Number 值反序列化为 int(错误 - 没有从 Number 值反序列化的 int/Int-argument 构造函数/工厂方法)
【发布时间】:2020-10-25 23:22:14
【问题描述】:

我有两个类 Promotion 和 PromotionZona 并且有这个错误。

这是我想要保存在数据库中的 json 请求。

"promotionZona":{"localidad":{"latitud":0.0,"longitud":0.0},"provincia":{},"todoElPais":true,"promotion":0,"promoZonaId":0}

您可以看到促销,但我无法将其保存到我的数据库中,我遇到了这样的错误:

2020-10-25 20:06:50.113  INFO 5550 --- [           main] o.s.s.quartz.SchedulerFactoryBean        : Starting Quartz Scheduler now
2020-10-25 20:06:50.113  INFO 5550 --- [           main] org.quartz.core.QuartzScheduler          : Scheduler quartzScheduler_$_NON_CLUSTERED started.
2020-10-25 20:06:50.133  INFO 5550 --- [           main] a.c.b.s.s.SuipBackofficeApplication      : Started SuipBackofficeApplication in 31.486 seconds (JVM running for 57.573)
2020-10-25 20:06:50.323  INFO 5550 --- [           main] org.apache.jasper.servlet.TldScanner     : At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
2020-10-25 20:06:50.419  INFO 5550 --- [           main] org.apache.coyote.ajp.AjpNioProtocol     : Starting ProtocolHandler ["ajp-nio-8109"]
2020-10-25 20:06:50.430  INFO 5550 --- [           main] org.apache.catalina.startup.Catalina     : Server startup in [47,370] milliseconds
2020-10-25 20:07:21.325  INFO 5550 --- [nio-8180-exec-3] o.a.c.c.C.[.[.[/suip-backoffice]         : Initializing Spring DispatcherServlet 'dispatcherServlet'
2020-10-25 20:07:21.327  INFO 5550 --- [nio-8180-exec-3] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2020-10-25 20:07:21.413  INFO 5550 --- [nio-8180-exec-3] o.s.web.servlet.DispatcherServlet        : Completed initialization in 86 ms
2020-10-25 20:07:21.759  WARN 5550 --- [nio-8180-exec-3] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot construct instance of `us.com.model.Promocion` (although at least one Creator exists): no int/Int-argument constructor/factory method to deserialize from Number value (0); nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `us.com.model.suipportalmodel.model.Promotion` (although at least one Creator exists): no int/Int-argument constructor/factory method to deserialize from Number value (0)
 at [Source: (PushbackInputStream); line: 1, column: 2650] (through reference chain: ar.com.model.suipportalmodel.dto.PromotionDTO["promotionZona"]->java.lang.Object[][0]->.PromotionZona["promotion"])]

我的实体推广区:

@Table(name="promotion_zona")
public class PromotionZona implements Serializable {


   @Id 
   @GeneratedValue(strategy = GenerationType.IDENTITY)//9
   @Column(name = "id_promotion_zona", unique = true, nullable= false)
   private Long idPromotionZona;
   
   
   @Column(name="todo_el_pais")
   private Boolean todoElPais;
   
   @Column(name="fecha_desde_solicitada")
   private Date fechaDesdeSolicitada;
   
   @Column(name="fecha_hasta_solicitada")
   private Date fechaHastaSolicitada;
   
   @Column(name="fecha_desde_confirmada")
   private Date fechaDesdeConfirmada;
   
   @Column(name="fecha_hasta_confirmada")
   private Date fechaHastaConfirmada;
   
   @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
   @JoinColumn(name="id_localidad",nullable=false)
   private Localidad localidad;
   
   @ManyToOne(fetch = FetchType.LAZY)
   @JoinColumn(name = "id_provincia", nullable = true)
   private Provincia provincia;
   
   @ManyToOne(fetch = FetchType.LAZY)
   @JoinColumn(name="id_promocion",nullable=false)
   private Promotion promotion; ```

【问题讨论】:

  • 不确定是否相关,但您的实体中有Promocion,请求中有promotion
  • 不相关,我现在改了,还是一样的错误
  • 你的 json 实际上不是有效的 json。您需要将其包装在 {} 中以使其有效。

标签: java


【解决方案1】:

当spring mvc无法将json数据反序列化到你的类Promotion时会发生错误,具体来说,它在"promotion":0 -> instance of class Promotion失败,因为Promotion是一个类,它必须看起来像这样:

public class Promotion {

    private int field1;
    
    //getters and setters
}

那么在你的json数据中,应该是:

"promotion":{"filed1": 0}

所以有几种方法可以解决这个问题:

  1. 显然您可以将您的请求更改为:
"promotionZona":{"localidad":{"latitud":0.0,"longitud":0.0},"provincia":{},"todoElPais":true,"promotion":{"field1":0},"promoZonaId":0}

  1. 为类Promotion添加一个int-argument构造函数:
public class Promotion {

    private int field1;

    public Promotion(int field1) {
        this.field1 = field1;
    }
    
    //getters and setters
}
  1. 添加自定义JsonDeserializer
public class PromotionJsonDeserializer extends JsonDeserializer<Promotion> {
    @Override
    public Promotion deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
        if(jsonParser == null)return null;

        Promotion promotion = new Promotion();
        promotion.setField1(Integer.valueOf(jsonParser.getText()));
        return promotion;
    }
}

然后在 PromotionZona 中,使用 PromotionJsonDeserializer 注释字段 promotion


@Table(name="promotion_zona")
public class PromotionZona implements Serializable {

   ...
 
   @JsonDeserialize(using = PromotionJsonDeserializer.class)
   @ManyToOne(fetch = FetchType.LAZY)
   @JoinColumn(name="id_promocion",nullable=false)
   private Promotion promotion;

【讨论】:

    猜你喜欢
    • 2021-12-21
    • 1970-01-01
    • 2022-12-12
    • 1970-01-01
    • 2020-10-06
    • 1970-01-01
    • 2017-10-19
    • 2020-04-18
    • 2013-04-11
    相关资源
    最近更新 更多