使用jackson:com.fasterxml.jackson.databind.exc.MismatchedInputException将xml映射到java时出错
我有一个必须解析并映射到Java类的xml文件:使用jackson:com.fasterxml.jackson.databind.exc.MismatchedInputException将xml映射到java时出错,java,xml,jackson,Java,Xml,Jackson,我有一个必须解析并映射到Java类的xml文件: <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"/>
<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>
XlDeployOrchestrator.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;
}
@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;
}
}
@JsonIgnoreProperties(ignoreUnknown = true)
public class XlDeployOrchestrator {
@JacksonXmlProperty(localName = "value")
private ArrayList <String> value;
}
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);
}
}
然后,我更改了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 + "]";
}
}
@JsonIgnoreProperties(ignoreUnknown=true)
公共类XLCI{
@JacksonXmlProperty(localName=“id”)
私有字符串id;
@JacksonXmlProperty(localName=“令牌”)
私有字符串令牌;
@JacksonXmlProperty(localName=“创建人”)
创建的私有字符串;
@JacksonXmlProperty(localName=“创建于”)
私有时间戳createdAt;
@JacksonXmlProperty(localName=“上次修改人”)
私有字符串被修改;
@JacksonXmlProperty(localName=“上次修改时间”)
私有时间戳修改;
@JacksonXmlProperty(localName=“version”)
私有XLREF版本;
@JacksonXmlProperty(localName=“环境”)
私有XLREF环境;
@JacksonXmlProperty(localName=“deployeds”)
部署的私人名单;
@JacksonXmlProperty(localName=“hotDeploy”)
公共字符串热部署;
@凌驾
公共字符串toString(){
返回“XlDeployCi[id=“+id+”,token=“+token+”,createdBy=“+createdBy+”,createdAt=“+createdAt
+,modifiedBy=“+modifiedBy+”,modifiedAt=“+modifiedAt+”,version=“+version
+,environment=“+environment+”,deployeds=“+deployeds+”,hotDeploy=“+hotDeploy+”];
}
}
我得到的错误是: com.fasterxml.jackson.databind.exc.MismatchedInputException:无法构造
package.XlDeployCi的实例
(尽管至少存在一个创建者):没有字符串参数构造函数/工厂方法从字符串值('false')反序列化
但是,如果我删除行false
,它将正常工作。
似乎,我不能做像Y
,我只能做
这样的事情。我找到了解决方案:
我的错误(一个可怕的错误),是,我忘了更改方法xmlMapper.readValue(字符串内容,类值类型)
实际上,我将映射对象的类设置为newtypereference(){}
。您应该这样做以获得列表,但实际上,我只需要一个对象。
我留下这个答案,以防有人犯与我相同的错误。我找到了解决方案:
我的错误(一个可怕的错误),是我忘记更改方法xmlMapper.readValue(字符串内容,类值类型)
实际上,我将映射对象的类设置为newtypereference(){}
。您应该这样做以获得列表,但实际上,我只需要一个对象。
我留下这个答案,以防有人和我犯同样的错误
@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 + "]";
}
}