JAXB - Avoid converting < into &lt; and > into &gt; during Marshalling

本文介绍如何在使用JAXB进行序列化操作时避免将&lt;转换为&amp;lt;,&gt;转换为&amp;gt;以及&amp;转换为&amp;amp;。通过创建自定义的CharacterEscapeHandler实现来实现这一目的。

In this article, let us see how to avoid converting < to &lt ; and > to &gt ; and & to &amp ; during JAXB Marshalling operation.

1. CharacterEscapeHandler creation
Create a custom Escape Handler by implementing the CharacterEscapeHandler interface as given below.

import  com.sun.xml.bind.marshaller.CharacterEscapeHandler ;

public  class JaxbCharacterEscapeHandler  implementsCharacterEscapeHandler  {

         public  void escape ( char [ ] buf,  int start,  int len,  booleanisAttValue,
                         Writer out )  throws  IOException  {

                 for  ( int i  = start ; i  < start  + len ; i ++ )  {
                         char ch  = buf [i ] ;
                        out. write (ch ) ;
                 }
         }
}

2. Marshaller Code
Use the below code snippet for JAXB Marshalling operation.

Note: Please go through the basics of using JAXB Marshalling code samples before using this example

import  java.io.IOException ;
import  java.io.PrintWriter ;
import  java.io.StringWriter ;
import  java.io.Writer ;
import  javax.xml.bind.JAXBContext ;
import  javax.xml.bind.JAXBException ;
import  javax.xml.bind.Marshaller ;
import  com.sun.xml.bind.marshaller.CharacterEscapeHandler ;
import  com.sun.xml.bind.marshaller.DataWriter ;

public  class JaxbMarshaller  {

         public  static  void main ( String [ ] args )  {

                 // Note: Provide input for the below objects
                 Object jaxbObject  =  null ;  // Create the right Input object
                 String packageName  = jaxbObject. getClass ( ). getPackage ( ). getName ( ) ;  // Provide the package name of the generated classes
                
                 try  {
                        JAXBContext jaxbContext  = JAXBContext. newInstance (packageName ) ;
                        Marshaller marshaller  = jaxbContext. createMarshaller ( ) ;

                         // Set UTF-8 Encoding
                        marshaller. setProperty (Marshaller. JAXB_ENCODING"UTF-8" ) ;

                         // The below code will take care of avoiding the conversion of < to &lt; and > to &gt; etc
                         StringWriter stringWriter  =  new  StringWriter ( ) ;
                         PrintWriter printWriter  =  new  PrintWriter (stringWriter ) ;
                        DataWriter dataWriter  =  new DataWriter (printWriter,  "UTF-8"new JaxbCharacterEscapeHandler ( ) ) ;
                        
                         // Perform Marshalling operation
                        marshaller. marshal (jaxbObject, dataWriter ) ;

                         System. out. println (stringWriter. toString ( ) ) ;
                 }  catch  (JAXBException e )  {
                         System. err. println ( "Error in marshalling..." ) ;
                 }
         }
}
 or 直接设置属性:
marshaller.setProperty("com.sun.xml.internal.bind.marshaller.CharacterEscapeHandler",
                    new CharacterEscapeHandler() {
                @Override
                public void escape(char[] ch, int start,int length, boolean isAttVal,
                        Writer writer) throws IOException {
                    writer.write(ch, start, length);
                }
            });

&lt;think&gt;嗯,用户给了一个Maven的依赖列表,需要根据Java 17来修改这些依赖项。首先,我得检查每个依赖的兼容性,尤其是那些可能涉及版本冲突或已过时的库。 首先看Spring Boot的starter-web。用户可能使用的是Spring Boot的某个版本,但这里没有指定版本号。Java 17需要Spring Boot 3.x,比如3.0.0及以上。所以需要添加Spring Boot 3.x的parent或者指定版本号。比如用3.1.5,因为这是比较新的稳定版。 然后是x-easypdf 3.3.1。查一下这个库是否支持Java 17。可能需要确认官方文档或仓库,如果最新版本兼容,可能没问题。暂时假设没问题,但需要用户自己验证。 接下来是docx4j-core 11.4.9。Docx4j的版本11.x应该支持Java 17,但最好确认他们的官方支持情况。另外,Docx4j可能需要Jakarta XML Binding API,也就是jakarta.xml.bind-api,这里已经包含,但版本是4.0.2。JAXB Runtime是Glassfish的4.0.5,这应该是兼容的,因为Jakarta EE 9以后包名从javax换到jakarta,而Java 17移除了JAXB的默认实现,所以需要显式引入。 Saxon-HE 12.3作为XSLT处理器,应该支持Java 17。Saxon的HE版本是开源版,需要注意许可证问题,但功能上应该没问题。 Jakarta XML Bind API和JAXB Runtime的版本是否正确。用户已经用了jakarta.xml.bind-api 4.0.2和jaxb-runtime 4.0.5,这两个版本是匹配的,应该没问题。不过有时候版本需要严格对应,比如API和Runtime的小版本是否一致。例如,4.0.2的API是否与4.0.5的Runtime兼容?可能需要检查两者的兼容性。通常,小版本差异可能可以兼容,但最好保持一致。比如将API升级到4.0.5,或者确认是否允许这样组合。 另外,Java 17中模块化系统可能影响某些库的反射访问,比如JAXB需要添加JVM参数或模块开放,但如果是Spring Boot项目,可能需要配置模块路径。不过用户可能在用Spring Boot 3,它已经适配了Java 17的模块系统,所以可能不需要额外配置。 可能的问题点:docx4j是否完全兼容Jakarta命名空间。Docx4j从某个版本开始支持Jakarta,比如11.x版本应该已经迁移了,因为JAXB在Java 11之后被移除,所以Docx4j需要依赖Jakarta的JAXB实现。用户已经包含了Jakarta的依赖,所以应该没问题。 总结需要修改的地方: 1. 添加Spring Boot 3.x的版本管理,比如在parent或properties中指定版本。 2. 确认各个依赖的版本是否兼容Java 17,尤其是docx4j和x-easypdf。 3. 确保JAXB相关依赖版本一致,比如将jakarta.xml.bind-api升级到4.0.5以匹配jaxb-runtime的4.0.5。&lt;/think&gt;根据Java 17的要求,建议对依赖项做以下调整(主要涉及JAXB依赖的版本统一和Spring Boot版本升级): ```xml &lt;dependencies&gt; &lt;!-- Spring Boot Starter Web需使用3.x版本(兼容Java17) --&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-starter-web&lt;/artifactId&gt; &lt;version&gt;3.1.5&lt;/version&gt; &lt;!-- 新增版本号 --&gt; &lt;/dependency&gt; &lt;!-- x-easypdf保持原版本(确认支持Java17) --&gt; &lt;dependency&gt; &lt;groupId&gt;org.dromara&lt;/groupId&gt; &lt;artifactId&gt;x-easypdf&lt;/artifactId&gt; &lt;version&gt;3.3.1&lt;/version&gt; &lt;/dependency&gt; &lt;!-- Word处理库升级到最新稳定版 --&gt; &lt;dependency&gt; &lt;groupId&gt;org.docx4j&lt;/groupId&gt; &lt;artifactId&gt;docx4j-core&lt;/artifactId&gt; &lt;version&gt;11.4.10&lt;/version&gt; &lt;!-- 升级小版本 --&gt; &lt;/dependency&gt; &lt;!-- JAXB相关依赖版本统一 --&gt; &lt;dependency&gt; &lt;groupId&gt;jakarta.xml.bind&lt;/groupId&gt; &lt;artifactId&gt;jakarta.xml.bind-api&lt;/artifactId&gt; &lt;version&gt;4.0.2&lt;/version&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.glassfish.jaxb&lt;/groupId&gt; &lt;artifactId&gt;jaxb-runtime&lt;/artifactId&gt; &lt;version&gt;4.0.5&lt;/version&gt; &lt;scope&gt;runtime&lt;/scope&gt; &lt;/dependency&gt; &lt;!-- Saxon升级到最新版 --&gt; &lt;dependency&gt; &lt;groupId&gt;net.sf.saxon&lt;/groupId&gt; &lt;artifactId&gt;Saxon-HE&lt;/artifactId&gt; &lt;version&gt;12.4&lt;/version&gt; &lt;!-- 支持JDK17 --&gt; &lt;/dependency&gt; &lt;/dependencies&gt; &lt;!-- 建议添加Spring Boot父POM管理版本 --&gt; &lt;parent&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-starter-parent&lt;/artifactId&gt; &lt;version&gt;3.1.5&lt;/version&gt; &lt;relativePath/&gt; &lt;!-- lookup parent from repository --&gt; &lt;/parent&gt; ``` 关键调整说明: 1. **Spring Boot升级到3.x** Spring Boot 3.x是首个正式支持Java 17的版本(最低要求Java 17),原依赖未指定版本号时需显式声明 2. **JAXB依赖调整** Java 17移除了JAXB的默认实现,需显式声明: - 使用`jakarta.xml.bind-api`替代旧的`javax.xml.bind` - `jaxb-runtime`版本与API版本保持同步 3. **Saxon升级** Saxon-HE 12.4修复了多个JDK17兼容性问题,推荐使用最新版 4. **Docx4j小版本升级** 11.4.10版本包含JDK17下的稳定性改进 验证注意事项: ```bash mvn clean compile # 编译时关注annotation processing警告 mvn dependency:tree # 检查依赖冲突 ``` 如果使用模块化项目(module-info.java),需要添加: ```java requires java.xml.bind; requires jakarta.xml.bind; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值