不能反序列化START_ARRAY令牌以外的Class实例



我正试图将以下数据读取到java对象中,但不知何故失败了。

期望输入数据到我的方法getInternalNodeMetadata:

事件[status=PUBLISHED, header=EventHeader{bu_id='2', mart_id='null', eventProducer=DCSQUARE, eventType='CARRIER', eventTimestamp=Wed Oct 28 13:54:02 IST 2020, callbackEnpoint='http://test.com/test-app/services/carriers/3000', eventFulfiller=DCSQUARE, modeOfOperation=INSERT, additionalData='null', comments='null', tenants='[TenantInfo {bu_id=2, mart_id=2}]'}, payload=null]

public Flux<Event> getInternalNodeMetadata(Flux<Message<String>> message) {
System.out.println(message.toString());
return message.flatMap(it -> {
System.out.println("Payload: " + it.getPayload());
String eventMessage = it.getPayload().substring(5,it.getPayload().length());
System.out.println("eventMessage: " + eventMessage);
Event event = null;
try {
event = objectMapper.readValue(eventMessage, Event.class);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
List<Event> internalNodeMetadataList = new ArrayList<>();
internalNodeMetadataList.add(event);
return Flux.fromIterable(internalNodeMetadataList);
});
}

上面的代码在这一行失败了event = objectMapper。readValue (eventMessage Event.class);

我已经使用了jackson-databind: 2.11.4 jar(用于从对象映射器类com.fasterxml.jackson.databind.ObjectMapper中读取值)

错误异常堆栈:

com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `com.test.events.Event` out of START_ARRAY token
at [Source: (String)" [status=PUBLISHED, header=EventHeader{bu_id='2', mart_id='null', eventProducer=DCSQUARE, eventType='CARRIER', eventTimestamp=Wed Oct 28 13:54:02 IST 2020, callbackEnpoint='http://test.com/test-app/services/carriers/3000', eventFulfiller=DCSQUARE, modeOfOperation=INSERT, additionalData='null', comments='null', tenants='[TenantInfo {bu_id=2, mart_id=2}]'}, payload=null]"; line: 1, column: 2]
at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:59)
at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1468)
at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1242)
at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1190)
at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeFromArray(BeanDeserializer.java:604)
at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:190)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:166)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4526)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3468)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3436)
at com.test.node.metadata.core.NodeMetadataServiceFacade.lambda$getInternalNodeMetadata$0(NodeMetadataServiceFacade.java:47)
有谁能帮我一下吗?提前感谢!

这是我的Event类

package com.test.events;
import java.io.Serializable;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(
name = "Event",
propOrder = {"status", "header", "payload"}
)
@XmlRootElement(
name = "Event"
)
public class Event<T> implements Serializable {
private static final long serialVersionUID = 1L;
@XmlElement(
name = "status",
required = true
)
private Status status;
@XmlElement(
name = "header",
required = true
)
private EventHeader header;
private T payload;
public Event() {
this.status = Status.FAIL;
}
public Event(EventHeader header, T payload) {
this.status = Status.FAIL;
this.header = header;
this.payload = payload;
}
public EventHeader getHeader() {
if (this.header == null) {
this.header = new EventHeader();
}
return this.header;
}
public EventHeader setHeader(EventHeader header) {
this.header = header;
return this.header;
}
public T getPayload() {
return this.payload;
}
public Event setPayload(T payload) {
this.payload = payload;
return this;
}
public Status getStatus() {
return this.status;
}
public Event setStatus(Status status) {
this.status = status;
return this;
}
public String toString() {
return "Event [status=" + this.status + ", header=" + this.header + ", payload=" + this.payload + "]";
}
}

这是我的EventData类

package com.test.events;
import com.test.com.util.DateTypeAdapter;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(
name = "EventHeader"
)
@XmlRootElement(
name = "EventHeader"
)
public class EventHeader implements Serializable {
private static final long serialVersionUID = 1L;
@XmlElement(
name = "WM_BU.ID",
required = true
)
private String bu_id;
@XmlElement(
name = "WM_MART.ID",
required = false
)
private String mart_id;
@XmlElement(
name = "EventProducer",
required = true
)
private EventHeader.CPSystem eventProducer;
@XmlElement(
name = "EventType",
required = true
)
private String eventType;
@XmlElement(
name = "EventTimestamp",
required = true
)
@XmlJavaTypeAdapter(DateTypeAdapter.class)
private Date eventTimestamp;
@XmlElement(
name = "CallbackEnpoint",
required = false
)
private String callbackEnpoint;
@XmlElement(
name = "EventFulfiller",
required = true
)
private EventHeader.CPSystem eventFulfiller;
@XmlElement(
name = "ModeOfOperation",
required = true
)
private EventHeader.ModeOfOperation modeOfOperation;
@XmlElement(
name = "AdditionalData",
required = false
)
private String additionalData;
@XmlElement(
name = "Comments",
required = false
)
private String comments;
@XmlElement(
name = "Tenants",
required = false
)
private List<TenantInfo> tenants;
public EventHeader() {
}
public EventHeader(String bu_id, String mart_id, EventHeader.CPSystem eventProducer, String eventType, Date eventTimestamp, String callbackEnpoint, EventHeader.CPSystem eventFulfiller, EventHeader.ModeOfOperation modeOfOperation, String additionalData, String comments) {
this.bu_id = bu_id;
this.mart_id = mart_id;
this.eventProducer = eventProducer;
this.eventType = eventType;
this.eventTimestamp = eventTimestamp;
this.callbackEnpoint = callbackEnpoint;
this.eventFulfiller = eventFulfiller;
this.modeOfOperation = modeOfOperation;
this.additionalData = additionalData;
this.comments = comments;
}
public EventHeader(String bu_id, String mart_id, EventHeader.CPSystem eventProducer, String eventType, Date eventTimestamp, String callbackEnpoint, EventHeader.CPSystem eventFulfiller, EventHeader.ModeOfOperation modeOfOperation, String additionalData, String comments, List<TenantInfo> tenants) {
this.bu_id = bu_id;
this.mart_id = mart_id;
this.eventProducer = eventProducer;
this.eventType = eventType;
this.eventTimestamp = eventTimestamp;
this.callbackEnpoint = callbackEnpoint;
this.eventFulfiller = eventFulfiller;
this.modeOfOperation = modeOfOperation;
this.additionalData = additionalData;
this.comments = comments;
this.tenants = tenants;
}
public String getBu_id() {
return this.bu_id;
}
public void setBu_id(String bu_id) {
this.bu_id = bu_id;
}
public String getMart_id() {
return this.mart_id;
}
public void setMart_id(String mart_id) {
this.mart_id = mart_id;
}
public EventHeader.CPSystem getEventProducer() {
return this.eventProducer;
}
public void setEventProducer(EventHeader.CPSystem eventProducer) {
this.eventProducer = eventProducer;
}
public String getEventType() {
return this.eventType;
}
public void setEventType(String eventType) {
this.eventType = eventType;
}
public Date getEventTimestamp() {
return this.eventTimestamp;
}
public void setEventTimestamp(Date eventTimestamp) {
this.eventTimestamp = eventTimestamp;
}
public String getCallbackEnpoint() {
return this.callbackEnpoint;
}
public void setCallbackEnpoint(String callbackEnpoint) {
this.callbackEnpoint = callbackEnpoint;
}
public EventHeader.CPSystem getEventFulfiller() {
return this.eventFulfiller;
}
public void setEventFulfiller(EventHeader.CPSystem eventFulfiller) {
this.eventFulfiller = eventFulfiller;
}
public EventHeader.ModeOfOperation getModeOfOperation() {
return this.modeOfOperation;
}
public void setModeOfOperation(EventHeader.ModeOfOperation modeOfOperation) {
this.modeOfOperation = modeOfOperation;
}
public String getAdditionalData() {
return this.additionalData;
}
public void setAdditionalData(String additionalData) {
this.additionalData = additionalData;
}
public String getComments() {
return this.comments;
}
public void setComments(String comments) {
this.comments = comments;
}
public List<TenantInfo> getTenants() {
return this.tenants;
}
public void setTenants(List<TenantInfo> tenants) {
this.tenants = tenants;
}
public String toString() {
return "EventHeader{bu_id='" + this.bu_id + ''' + ", mart_id='" + this.mart_id + ''' + ", eventProducer=" + this.eventProducer + ", eventType='" + this.eventType + ''' + ", eventTimestamp=" + this.eventTimestamp + ", callbackEnpoint='" + this.callbackEnpoint + ''' + ", eventFulfiller=" + this.eventFulfiller + ", modeOfOperation=" + this.modeOfOperation + ", additionalData='" + this.additionalData + ''' + ", comments='" + this.comments + ''' + ", tenants='" + this.tenants + ''' + '}';
}
public static enum CPSystem {
DCSQUARE,
IMS,
OMS,
FOCI,
MCSE,
LMS,
LMDE,
SIMS,
GSCOPE,
PARTNER_MASTER,
PARTNER_PORTAL,
CAP,
SYNAPSE,
LIMO;
private CPSystem() {
}
}
public static enum ModeOfOperation {
INSERT,
UPDATE,
DELETE,
PUT,
POST;
private ModeOfOperation() {
}
}
}

这是我的DataTypeAdapter类

package com.test.common.util;
import java.text.ParseException;
import java.util.Calendar;
import java.util.Date;
import javax.xml.bind.DatatypeConverter;
import javax.xml.bind.annotation.adapters.XmlAdapter;
import javax.xml.datatype.DatatypeConfigurationException;
public class DateTypeAdapter extends XmlAdapter<String, Date> {
public static final String DATE_TIME_FORMAT_REGEX = "[0-9]{4}-(0[1-9]{1}|1[0-2]{1})-([0-2][0-9]|3[0-1])T([0-1][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])(([.]([0-9]{3}))?+)[-+][0-9]{2}:[0-9]{2}";
public DateTypeAdapter() {
}
public Date unmarshal(String v) throws ParseException {
if (v != null && v.trim().length() > 0) {
try {
if (!v.matches("[0-9]{4}-(0[1-9]{1}|1[0-2]{1})-([0-2][0-9]|3[0-1])T([0-1][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])(([.]([0-9]{3}))?+)[-+][0-9]{2}:[0-9]{2}")) {
throw new ParseException("Invalid date format provided. Allowed date format should follow the format {yyyy-MM-ddThh:mm:ss.millisecs-+Zone}. e.g. 2015-11-30T16:12:05.195-08:00", 0);
} else {
Calendar cal = DatatypeConverter.parseDateTime(v);
cal.setLenient(false);
return cal.getTime();
}
} catch (IllegalArgumentException var3) {
throw new ParseException("Invalid date format " + v, 0);
}
} else {
return null;
}
}
public String marshal(Date v) throws ParseException, DatatypeConfigurationException {
Calendar c = Calendar.getInstance();
c.setTime(v);
String dateTime = DatatypeConverter.printDateTime(c).replace("Z", "+00:00");
return dateTime;
}
}

你正在发送一个事件数组到getinternalnodemetadata;并试图将其反序列化为单个事件,这就是为什么你会得到错误,你需要它反序列化为事件列表

event = objectMapper.readValue(eventMessage, Event.class);

这里你可能需要做一些类似

的事情
List<Event> eventList = mapper.readValue(eventMessage, List.class);

最新更新