Java 从数值反序列化为int(错误-没有int/int参数构造函数/工厂方法从数值反序列化)
我有两个班,一个是升级班,另一个是升级班。Zona和hava都犯了这个错误 这是我想要保存在数据库中的json请求Java 从数值反序列化为int(错误-没有int/int参数构造函数/工厂方法从数值反序列化),java,Java,我有两个班,一个是升级班,另一个是升级班。Zona和hava都犯了这个错误 这是我想要保存在数据库中的json请求 "promotionZona":{"localidad":{"latitud":0.0,"longitud":0.0},"provincia":{},"todoElPais":true,"promotion":0,"promoZona
"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"])]
我的实体促销Zona:
@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; ```
当spring mvc未能将json数据反序列化到类
升级
时会发生错误,具体来说,它在升级:0->类升级实例
时失败,因为升级
是一个类,它必须看起来像这样:
public class Promotion {
private int field1;
//getters and setters
}
然后在json数据中,它应该是:
"promotion":{"filed1": 0}
所以有几种方法可以解决这个问题:
升级:
JsonDeserializer
:当spring mvc未能将json数据反序列化到类
升级
时会发生错误,具体来说,它在升级:0->类升级实例
时失败,因为升级
是一个类,它必须看起来像这样:
public class Promotion {
private int field1;
//getters and setters
}
然后在json数据中,它应该是:
"promotion":{"filed1": 0}
所以有几种方法可以解决这个问题:
升级:
JsonDeserializer
:不确定是否相关,但您的实体中有
promotion
,请求中有promotion
。这不相关,我现在更改,但您的json错误实际上不是有效的json。您需要将其包装在{}中以使其有效。不确定是否相关,但您的实体中有promotion
,请求中有promotion
。它不相关,我现在更改,但您的json错误实际上不是有效的json。您需要将其包装在{}中以使其有效。
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;
}
}
@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;