gpt4 book ai didi

java - 使用带有自定义字符转义处理程序的 jaxb 将对象转换为 xml 时出错

转载 作者:行者123 更新时间:2023-11-30 01:55:14 25 4
gpt4 key购买 nike

嗨,我正在尝试使用 JAXB marshaller 将 JAVA 对象转换为 xml。我正在使用自定义异常处理程序,因为我想摆脱 jaxb 将一些特殊字符(例如 & )转换为 html & 的情况。我正在使用 java 8。我不确定我的代码有什么问题。以下是我尝试使用 jaxb 类将对象转换为 xml 的代码。

 JAXBContext jaxbContext = JAXBContext.newInstance(SmilDTO.class);

Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
marshaller.setProperty( MepCharacterEscapeHandler.class.getName(), new MepCharacterEscapeHandler() );
StringWriter stringWriter = new StringWriter();
marshaller.marshal(smilDTO, stringWriter);
String smilDefinition = stringWriter.toString();

log.debug("Created SMIL definition : {}", smilDefinition);

return Optional.of(smilDefinition);
} catch (JAXBException e) {
e.printStackTrace();
log.error("Cannot parse slides into SMIL definition! {}", e.getMessage());
return Optional.empty();
}

这是我的转义字符处理程序类。公共(public)类 MepCharacterEscapeHandler 实现 com.sun.xml.internal.bind.marshaller.CharacterEscapeHandler {

    @Override
public void escape(char[] ch, int start, int length, boolean isAttVal, Writer out) throws IOException {
// avoid calling the Writerwrite method too much by assuming
// that the escaping occurs rarely.
// profiling revealed that this is faster than the naive code.
int limit = start+length;
for (int i = start; i < limit; i++) {
char c = ch[i];
if(c == '&' || c == '<' || c == '>' || c == '\r' || (c == '\"' && isAttVal) ) {
if(i!=start)
out.write(ch,start,i-start);
start = i+1;
switch (ch[i]) {
case '&':
out.write("&");
break;
case '<':
out.write("<");
break;
case '>':
out.write("<");
break;
case '\"':
out.write("\";");
break;
}
}
}

if( start!=limit )
out.write(ch,start,limit-start);
}

}

但是我遇到了如下异常

javax.xml.bind.PropertyException: name: com.openmind.primecast.config.MepCharacterEscapeHandler value: com.openmind.primecast.config.MepCharacterEscapeHandler@4970b93d
at javax.xml.bind.helpers.AbstractMarshallerImpl.setProperty(AbstractMarshallerImpl.java:358)
at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.setProperty(MarshallerImpl.java:527)
at com.openmind.primecast.service.SmilService.getSmilDefinitionFromSlides(SmilService.java:56)
at com.openmind.primecast.service.mapper.TemplateMapper.parseSlideDTOList(TemplateMapper.java:56)
at com.openmind.primecast.service.mapper.TemplateMapperImpl.toEntity(TemplateMapperImpl.java:96)
at com.openmind.primecast.service.impl.TemplateServiceImpl.create(TemplateServiceImpl.java:85)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:333)

感谢任何帮助尝试了所有选项,但没有成功谢谢你

最佳答案

尝试添加以下 Maven 依赖项。

<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.2.3</version>
</dependency>

如本https://stackoverflow.com/a/45595929/5543072中所示

关于java - 使用带有自定义字符转义处理程序的 jaxb 将对象转换为 xml 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54744999/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com