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

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

吕亮
2023-03-14

大家好,我正在尝试使用JAXB marshaller将JAVA对象转换为xml。我使用一个自定义异常处理程序,因为我想摆脱jaxb转换一些特殊字符,例如

 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();
        }

这是我的转义字符处理程序类。公共类MepCharacterEscapeHandler实现com。太阳xml。内部的绑定马歇尔。角色逃脱者{

    @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)

谢谢你的帮助我尝试了所有的方法但都没用谢谢

共有1个答案

宣望
2023-03-14

尝试添加以下maven依赖项。

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

如本文所述https://stackoverflow.com/a/45595929/5543072

 类似资料:
  • 我有一个类,它有一个包含的列表。在我的应用程序中,我在中设置细节,然后添加到的中,然后使用将转换为。 下面代码行的1个illegalAnnotationExc一定类有两个相同名称的属性trainingList

  • 这是我的字符串格式的肥皂xml,我需要如何在Farm对象中形成它。Farm是我的自定义类,任何库都是现成的 使用此代码后,我得到了异常 意外元素(uri:“http://yyyyyy . yyyyy * * * * * * * *”,local:“farm”)。预期的元素有

  • 我正在尝试使用JAXB从对象构建XML。 但是我错过了一些东西,因为我得到了一个例外: javax.xml.bind.MarshalExc0019-具有链接异常:[com.sun.istack.internal.SAXException2:类雇员及其任何超级类在此上下文中都是已知的。javax.xml.bind.JAXBExc0019:类雇员及其任何超级类在此上下文中都是已知的。]

  • 我想使用XML有效载荷,比如: 另一种有效载荷是: 所以我想为创建一个类,其中包含和一个,我可以在其中放置不同类型的对象,所以我尝试了多种类型的对象一个带有的类,但它不允许我具有相同的名称 在这种情况下我能做什么?提前感谢。

  • 使用代替和代替 然后在请求属性中添加 但是当我在javascript中检索它时,我得到了jsonObject的值 我在我的项目中已经使用了下面的库,如果需要,可以使用任何新的库

  • 问题内容: 我正在尝试为Json.NET创建一个自定义ValueProvider,它将跳过序列化所有对象的过程,并将仅返回Guid类型的属性来表示其主键(作为参考)。 例: 应成为: 这是我到目前为止编写的代码。我非常接近使其工作,但是就我而言,我似乎无法获取对象值。我怎样才能做到这一点? 问题答案: 您希望将值从嵌套对象内部提升到父对象。为此,您需要将两个价值提供者链接在一起: 一个外部值提供者