jackson.databind 异常的临时解决方案

本文介绍了一种在Java中处理游戏角色数据的方法,通过使用FighterImage类来存储和转换战斗数据,并采用序列化技巧解决对象引用问题。

找不到finalData的具体位置 于是 用了一个临时解决方案:

package hero;

import java.io.Serializable;

import org.json.JSONException;
import org.json.JSONObject;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

import door.IFighterImage;
import door.IPet;
import door.IPlayer;
import door.IPlayerRoleFighter;
import fight.FightData;
import fight.Fighter;

@JsonIgnoreProperties(value =
{ "fightData", "finalData", "finData" })
public class FighterImage extends Fighter implements IFighterImage,
		Serializable
{
	private static final long serialVersionUID = -7938551050003282250L;

	/** 镜像类型 0-人物 1-宠物 2-召唤兽 */
	private int fighterType = 0;

	private int masterId = 0;

	/** 数据STR JSON用 */
	public String fightDataStr = "";

	public FighterImage()
	{
	}

	public FighterImage(IPlayer user)
	{
		this.fighterType = TYPE_HERO;
		this.masterId = user.getRoleId();
		IPlayerRoleFighter roleFighter = user.getUsedRoleFighter();
		if (roleFighter != null)
		{
			this.fightData = (FightData) roleFighter.getFightData();
		}
	}

	public FighterImage(IPet p, int masterId)
	{
		this.fighterType = TYPE_PET;
		this.masterId = masterId;
		if (p != null)
		{
			this.fightData = (FightData) p.getFightData();
		}
	}

	public String getFightDataStr()
	{
		try
		{
			StringBuilder sb = new StringBuilder();
			for (int key : Fight_ARRS)
			{
				sb.append(key);
				sb.append("=");
				sb.append(this.fightData.getValue(key));
				sb.append(",");
			}
			this.fightDataStr = sb.toString();
			return this.fightDataStr.substring(0,
					this.fightDataStr.length() - 1);
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
		return this.fightDataStr;
	}

	public void strToFightData()
	{
		try
		{
			this.fightData = new FightData();
			for (String kv : this.fightDataStr.split(","))
			{
				this.fightData.setValue(Integer.parseInt(kv.split("=")[0]),
						Double.parseDouble(kv.split("=")[1]));
			}
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
	}

	public void setFightDataStr(String fightDataStr)
	{
		this.fightDataStr = fightDataStr;
	}

	public int getMasterId()
	{
		return masterId;
	}

	public int getFighterType()
	{
		return fighterType;
	}

	public void setFighterType(int fighterType)
	{
		this.fighterType = fighterType;
	}

	public void setMasterId(int masterId)
	{
		this.masterId = masterId;
	}

	@Override
	public int getGrade()
	{
		return 0;
	}

	@Override
	public void setLv(int lv)
	{
	}

	@Override
	public void bytesWriteToFront(JSONObject js) throws JSONException
	{
	}

	@Override
	public String getName()
	{
		return null;
	}

	@Override
	public void setPerBlood(int he, int blood)
	{
	}

	@Override
	public String getStyle()
	{
		return null;
	}

	@Override
	public void bytesWriteZbToFront(JSONObject js) throws JSONException
	{
	}

	@Override
	public void bytesWriteSkillToFront(JSONObject js) throws JSONException
	{
	}
}
用一个基本类型 替代了引用类型 规避掉了找不到的属性对象

之后又报了一个递归的错误

直接忽略掉属性:

@JsonIgnoreProperties(value =
{ "newinstance" })
public class SkillModel extends GameData
{
	/** 技能id */
	public int id = 0;

	/** 技能名字 */
	public String name = null;


于是 解决了所有问题
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:787) at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178) at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:732) at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:772) at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178) at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:732) at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:772) at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178) at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:732) at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:772) at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178) at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:732) at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:772) at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178) at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:732) at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:772) at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178) at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:732) at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:772) at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178) at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:732) at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:772) at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178)这个是哪里有问题
07-29
12-17-2025 18:24:01.367 INFO [http-nio-9091-exec-4] [] com.tplink.smb.omada.common.data.manager.service.actuate.GenericDataEndpoint.batchUpsertData(46): Generic data batch upsert operation start, json length: 703 12-17-2025 18:24:01.373 ERROR [http-nio-9091-exec-4] [] com.tplink.smb.omada.common.data.manager.service.actuate.GenericDataEndpoint.batchUpsertData(70): Failed to process batch upsert data com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `com.tplink.smb.omada.common.data.manager.controller.vo.actuate.GenericDataBatchRequestVO` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('data') at [Source: REDACTED (`StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION` disabled); line: 1, column: 1] at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:63) ~[jackson-databind-2.18.2.jar:2.18.2] at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1754) ~[jackson-databind-2.18.2.jar:2.18.2] at com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1379) ~[jackson-databind-2.18.2.jar:2.18.2] at com.fasterxml.jackson.databind.deser.std.StdDeserializer._deserializeFromString(StdDeserializer.java:311) ~[jackson-databind-2.18.2.jar:2.18.2] at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromString(BeanDeserializerBase.java:1592) ~[jackson-databind-2.18.2.jar:2.18.2] at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:197) ~[jackson-databind-2.18.2.jar:2.18.2] at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:187) ~[jackson-databind-2.18.2.jar:2.18.2] at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:342) ~[jackson-databind-2.18.2.jar:2.18.2]
12-18
12-17-2025 18:26:34.267 INFO [http-nio-9091-exec-7] [] com.tplink.smb.omada.common.data.manager.service.actuate.GenericDataEndpoint.batchUpsertData(46): Generic data batch upsert operation start, json length: 705 12-17-2025 18:26:36.324 ERROR [http-nio-9091-exec-7] [] com.tplink.smb.omada.common.data.manager.service.actuate.GenericDataEndpoint.batchUpsertData(70): Failed to process batch upsert data com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "type" (class com.tplink.smb.omada.common.data.manager.controller.vo.actuate.GenericDataVO), not marked as ignorable (4 known properties: "model", "model_version", "country", "data"]) at [Source: REDACTED (`StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION` disabled); line: 1, column: 59] (through reference chain: com.tplink.smb.omada.common.data.manager.controller.vo.actuate.GenericDataBatchRequestVO["data"]->java.util.LinkedHashMap["deviceModelTemplates"]->java.util.ArrayList[0]->com.tplink.smb.omada.common.data.manager.controller.vo.actuate.GenericDataVO["type"]) at com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:61) ~[jackson-databind-2.18.2.jar:2.18.2] at com.fasterxml.jackson.databind.DeserializationContext.handleUnknownProperty(DeserializationContext.java:1153) ~[jackson-databind-2.18.2.jar:2.18.2] at com.fasterxml.jackson.databind.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:2241) ~[jackson-databind-2.18.2.jar:2.18.2] at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownProperty(BeanDeserializerBase.java:1821) ~[jackson-databind-2.18.2.jar:2.18.2] at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownVanilla(BeanDeserializerBase.java:1799) ~[jackson-databind-2.18.2.jar:2.18.2] at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:316) ~[jackson-databind-2.18.2.jar:2.18.2] at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:177) ~[jackson-databind-2.18.2.jar:2.18.2] at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer._deserializeFromArray(CollectionDeserializer.java:361) ~[jackson-databind-2.18.2.jar:2.18.2]
最新发布
12-18
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值