当前位置: 首页 > 知识库问答 >
问题:

使用jackson:com将xml映射到java时出错。fasterxml。杰克逊。数据绑定。exc.MismatchedInputException不匹配

吉鸿宝
2023-03-14

我有一个xml文件,需要解析并映射到Java类:

<udm.DeployedApplication id="ID" token="TOKEN" created-by="AUTHOR" created-at="2018-12-10T10:02:36.264+0000" last-modified-by="AUTHOR" last-modified-at="2019-05-21T18:16:07.492+0000">
    <version ref="REF"/>
    <environment ref="REF2"/>
    <deployeds>
        <ci ref="ref3"/>
    </deployeds>
    <orchestrator>
        <value>value1</value>
        <value>value2</value>
        <value>value3</value>
    </orchestrator>
    <optimizePlan>true</optimizePlan>
    <boundConfigurationItems/>
    <unresolvedPlaceholders/>
    <undeployDependencies>false</undeployDependencies>
    <bpcForceUndeployment>false</bpcForceUndeployment>
    <enableAutomaticOrchestrators>true</enableAutomaticOrchestrators>
    <hotDeploy>false</hotDeploy>
</udm.DeployedApplication>

XlDeployCi。java:

@JsonIgnoreProperties(ignoreUnknown = true)
public class XlDeployCi {
    @JacksonXmlProperty(localName = "id")
    private String id;
    @JacksonXmlProperty(localName = "token")
    private String token;
    @JacksonXmlProperty(localName = "created-by")
    private String createdBy;
    @JacksonXmlProperty(localName = "created-at")
    private Timestamp createdAt;
    @JacksonXmlProperty(localName = "last-modified-by")
    private String modifiedBy;
    @JacksonXmlProperty(localName = "last-modified-at")
    private Timestamp modifiedAt;

    @JacksonXmlProperty(localName = "version")
    private XlDeployRef version;
    @JacksonXmlProperty(localName = "environment")
    private XlDeployRef environment;
    @JacksonXmlProperty(localName = "deployeds")
    private List<XlDeployRef> deployeds;

    @JacksonXmlProperty(localName = "orchestrator")
    private XlDeployOrchestrator orchestrator;

    @JacksonXmlProperty(localName = "boundConfigurationItems")
    private String boundConfigurationItems;
    @JacksonXmlProperty(localName = "unresolvedPlaceholders")
    private String unresolvedPlaceholders;
    @JacksonXmlProperty(localName = "optimizePlan")
    private Boolean optimizePlan;
    @JacksonXmlProperty(localName = "undeployDependencies")
    private Boolean undeployDependencies;
    @JacksonXmlProperty(localName = "bpcForceUndeployment")
    private Boolean bpcForceUndeployment;
    @JacksonXmlProperty(localName = "enableAutomaticOrchestrators")
    private Boolean enableAutomaticOrchestrators;
    @JacksonXmlProperty(localName = "hotDeploy")
    private Boolean hotDeploy;
}

XlDeployRef。java:

@JsonIgnoreProperties(ignoreUnknown = true)
public class XlDeployRef {
    @JacksonXmlProperty(localName = "ref")
    private String ref;

    public String getRef() {
        return ref;
    }

    public void setRef(String ref) {
        this.ref = ref;
    }
}

XlDeployOrchestrator。java:

@JsonIgnoreProperties(ignoreUnknown = true)
public class XlDeployOrchestrator {
    @JacksonXmlProperty(localName = "value")
    private ArrayList <String> value;
}

TestXml。java:

public class TestXml {

    private static final String FILE_PATH = "src/main/resources/xmlRest.txt";

    @Test
    public void testXml() throws JsonParseException, JsonMappingException, IOException {
        String xmlFile = readFile(FILE_PATH, Charset.defaultCharset());
        XmlMapper xmlMapper = new XmlMapper();

        xmlMapper.setDefaultUseWrapper(false);
        xmlMapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);

        List<XlDeployCi> list = xmlMapper.readValue(xmlFile, new TypeReference<List<XlDeployCi>>() {});

        list.forEach(System.out::println);
    }

    private static String readFile(String path, Charset encoding) throws IOException {
        byte[] encoded = Files.readAllBytes(Paths.get(path));
        return new String(encoded, encoding);
    }
}

我得到的错误:

com.fasterxml.jackson.databind.exc.MismatchedInputException:无法构造包的实例。XlDeployCi(尽管至少存在一个Creator):没有String参数构造函数/工厂方法从String值反序列化('true')

我尝试了一些东西,发现了一些奇怪的东西,我将我的xml文件更改为:

<udm.DeployedApplication id="Environments/UAT/Env/UAT-DCS_APL/dcs-application" token="b3dd242b-66ff-4548-81b1-062c8a1152be" created-by="ext.pcuciniello" created-at="2018-12-10T10:02:36.264+0000" last-modified-by="ext.pcuciniello" last-modified-at="2019-05-21T18:16:07.492+0000">
    <version ref="Applications/Shipping/Java/DCS/dcs-application/dcs1.8.5-20190521"/>
    <environment ref="Environments/UAT/Env/UAT-DCS_APL"/>
    <deployeds>
        <ci ref="Infrastructure/UAT/WEBLO/UAT_DCS_APL_DOMAIN/DCS_UAT_CLUSTER/dcs-application"/>
    </deployeds>
    <hotDeploy>true</hotDeploy>
</udm.DeployedApplication>

然后,我更改了XlDeployCi。java文件:

@JsonIgnoreProperties(ignoreUnknown = true)
public class XlDeployCi {

    @JacksonXmlProperty(localName = "id")
    private String id;
    @JacksonXmlProperty(localName = "token")
    private String token;
    @JacksonXmlProperty(localName = "created-by")
    private String createdBy;
    @JacksonXmlProperty(localName = "created-at")
    private Timestamp createdAt;
    @JacksonXmlProperty(localName = "last-modified-by")
    private String modifiedBy;
    @JacksonXmlProperty(localName = "last-modified-at")
    private Timestamp modifiedAt;

    @JacksonXmlProperty(localName = "version")
    private XlDeployRef version;
    @JacksonXmlProperty(localName = "environment")
    private XlDeployRef environment;
    @JacksonXmlProperty(localName = "deployeds")
    private List<XlDeployRef> deployeds;

    @JacksonXmlProperty(localName = "hotDeploy")
    public String hotDeploy;

    @Override
    public String toString() {
        return "XlDeployCi [id=" + id + ", token=" + token + ", createdBy=" + createdBy + ", createdAt=" + createdAt
                + ", modifiedBy=" + modifiedBy + ", modifiedAt=" + modifiedAt + ", version=" + version
                + ", environment=" + environment + ", deployeds=" + deployeds + ", hotDeploy=" + hotDeploy + "]";
    }

}

我得到的错误:

通用域名格式。fasterxml。杰克逊。数据绑定。exc.MismatchedInputException:无法构造包的实例。XlDeployCi(尽管至少存在一个创建者):没有字符串参数构造函数/工厂方法从字符串值('false')反序列化

但是,如果我删除行

看起来,我不能做像<代码>


共有1个答案

宰父德馨
2023-03-14

我找到了解决方案:
我的错误(一个可怕的错误)是,我忘记更改方法xmlMapper的映射类的类型。readValue(字符串内容,类

我留下这个答案,以防有人和我犯同样的错误。

 类似资料:
  • 我正在尝试使用fasterxml将json应答解析为POJO。但问题是,json回复包含嵌套的对象,其中包含反斜杠,所以在ObjectMapper读取该值时,我收到了com。fasterxml。杰克逊。数据绑定。exc.不匹配计算异常 我不知道如何用fasterxml解析这个对象?! 我的POJO对象模型如下所示: 我收到的原始json消息: “交易/报价/BTC-PLN-BTC-C-C-PLN,

  • 当我尝试反序列化汽车类时,我得到了下面的错误。杰克逊正试图在父类中的子元素中搜索字段。我如何确保杰克逊使用适当的子类型进行反序列化?我相信我需要使用混合/客户转换器。但我不确定如何在这个特定场景中使用它们。 注意:在我的例子中,除TestMain之外的所有类都在一个jar文件中,我不能修改源文件。 错误 线程"main"中的异常com.fasterxml.jackson.databind.exc.

  • 问题内容: 我正在使用Jackson XML映射器将XML反序列化为POJO。XML看起来像 我的课看起来像 我想将电话号码设置为“电话”类别中的号码。我无法更改XML或类的构造方式。我收到无法构造错误的实例,并创建了一个AgencyPhone构造函数 但这没有用。那么如何反序列化嵌套实例。 问题答案: 您可以编写自己的自定义解串器来实现此目的。这是使您入门的代码:

  • 问题内容: 我在使用Jackson映射Javascript发布的哈希表(标记)数组时遇到问题。 这是控制器@RequestBody接收到的数据(以正确的json requestheader发送): 这是控制器: 当我调试并查看“实体”值时,它显示为通用对象的ArrayList,而不是我期望的“标签”类型的对象列表。 我如何让杰克逊将传递的对象数组映射到“标签”类型的对象列表? 谢谢 问题答案: 听

  • 我遇到了反序列化问题: 这是我的班级: 我要反序列化的JSON是: 我得到以下例外: 我不想补充: 因为我想得到ResObj... 如果我添加注释,它会通过,但会将其设置为null。。这是我不想要的。

  • 下面的类显示问题-导入com。fasterxml。无法解析jackson- 运行时编译错误- pom定义是这样的,它位于项目的pom中,该项目被定义为当前项目的依赖项- 和 我检查了这个组件的maven存储库,它似乎没有任何依赖项。 我尝试将版本更改为最新版本-2.10.0。pr1并尝试对依赖项项目进行maven更新,但找不到内部下载的jar。m2、该组件对应的目录结构有两条路径- .m2/fas