Force escaping Special character in XML Marshalling in Spring(Spring中XML编组中的强制转义特殊字符)
问题描述
我想在使用 Spring Marshaller 时强制转义特殊字符.当我使用 javax.xml.bind.Marshaller
I want to force escaping special characters when I use Spring Marshaller. Below code is perfectly working when I use javax.xml.bind.Marshaller
图书课
package com.odr.core.action;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRegistry;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "book")
public class Book {
private String name;
private String author;
private String publisher;
private String isbn;
@XmlJavaTypeAdapter(value=CDATAAdapter.class)
private String description;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getPublisher() {
return publisher;
}
public void setPublisher(String publisher) {
this.publisher = publisher;
}
public String getIsbn() {
return isbn;
}
public void setIsbn(String isbn) {
this.isbn = isbn;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
@Override
public String toString() {
return "Book [name=" + name + ", author=" + author + ", publisher="
+ publisher + ", isbn=" + isbn + ", description=" + description
+ "]";
}
}
对象到 XML
writer = new BufferedWriter(new FileWriter(selectedFile));
context = JAXBContext.newInstance(Book.class);
Marshaller m = context.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
m.setProperty("com.sun.xml.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);
}
});
m.marshal(book, writer);
输出:
<description>
<![CDATA[<p>With hundreds of practice questions and hands-on exercises, <b>SCJP Sun Certified Programmer for Java 6 Study Guide</b> covers what you need to know--and shows you how to prepare--for this challenging exam. </p>]]>
</description>
但是当我使用 org.springframework.oxm.jaxb.Jaxb2Marshaller 时,同样的代码不起作用,下面是代码
But same kind of code is not working when I use org.springframework.oxm.jaxb.Jaxb2Marshaller, Below is the code
Jaxb2Marshaller jaxb2Marshaller = new Jaxb2Marshaller();
Map<String, Object> map = new HashMap<String, Object>();
map.put("jaxb.formatted.output", true);
jaxb2Marshaller.setPackagesToScan("com.odr.core.action");
// com.sun.xml.bind.characterEscapeHandler
// com.sun.xml.bind.marshaller.CharacterEscapeHandler
map.put("com.sun.xml.bind.marshaller.CharacterEscapeHandler",
new CharacterEscapeHandler() {
@Override
public void escape(char[] ac, int i, int j, boolean flag,
Writer writer) throws IOException {
writer.write(ac, i, j);
}
});
jaxb2Marshaller.setMarshallerProperties(map);
org.springframework.oxm.Marshaller marshaller = jaxb2Marshaller;
FileOutputStream fos = null;
// String fileNamePath = directory.getAbsolutePath() + "\" + fileName;
try {
// fos = new FileOutputStream(fileNamePath);
fos = new FileOutputStream(selectedFile);
marshaller.marshal(book, new StreamResult(fos));
// File f = new File(directory,fileName);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (fos != null) {
fos.close();
}
}
输出
<description><![CDATA[<p>With hundreds of practice questions and hands-on exercises, <b>SCJP Sun Certified Programmer for Java 6 Study Guide</b> covers what you need to know--and shows you how to prepare--for this challenging exam. </p>]]></description>
第一个片段没有对特殊字符进行编码.但是,虽然我设置了属性,但使用 Spring 的第二个片段确实进行了编码.为了不影响现有代码,我必须在我的项目中使用 Spring.有什么办法可以解决吗
The first snippet didn't encode the special characters. But the second snippet which is using Spring did encode though I set property. I have to use Spring in my project for not affecting existing code. Is there any way I can fix it
推荐答案
好的,我也遇到了同样的问题,就这样解决了.
Ok, I had the same problem, and I solved it this way.
首先要做的事情.您应该创建两个 bean.一个用于 Jaxb2Marshaller
,另一个用于 MarshallingHttpMessageConverter
.我假设你想保留你的配置,所以我将使用你的代码.
First things first. You should create two beans. One for the Jaxb2Marshaller
and another MarshallingHttpMessageConverter
. I'm supposing that you want to keep your configuration, so I'm going to use your code.
创建 Jaxb2Marshaller
bean:
@Bean
public Jaxb2Marshaller getJaxb2Marshaller() {
Jaxb2Marshaller jaxb2Marshaller = new Jaxb2Marshaller();
Map<String, Object> map = new HashMap<String, Object>();
map.put("jaxb.formatted.output", true);
jaxb2Marshaller.setPackagesToScan("com.odr.core.action");
map.put("com.sun.xml.internal.bind.marshaller.CharacterEscapeHandler",
new CharacterEscapeHandler() {
@Override
public void escape(char[] ac, int i, int j, boolean flag,
Writer writer) throws IOException {
writer.write(ac, i, j);
}
});
jaxb2Marshaller.setMarshallerProperties(map);
org.springframework.oxm.Marshaller marshaller = jaxb2Marshaller;
FileOutputStream fos = null;
try {
fos = new FileOutputStream(selectedFile);
marshaller.marshal(book, new StreamResult(fos));
} catch (Exception e) {
e.printStackTrace();
} finally {
if (fos != null) {
fos.close();
}
}
return jaxb2Marshaller;
}
好吧,我使用的是 Java 8,所以我将 com.sun.xml.bind.marshaller.CharacterEscapeHandler 更改为 com.sun.xml.internal.bind.marshaller.CharacterEscapeHandler 如上所示.
Well, I'm using Java 8 so I changed com.sun.xml.bind.marshaller.CharacterEscapeHandler to com.sun.xml.internal.bind.marshaller.CharacterEscapeHandler as you can see above.
创建 MarshallingHttpMessageConverter
bean:
@Bean
public MarshallingHttpMessageConverter getMarshallingHttpMessageConverter() {
return new MarshallingHttpMessageConverter(getJaxb2Marshaller());
}
您必须注意到我创建了自己的 HttpMessageConverter 来解决问题.这是因为 Spring 使用它自己的转换器,每次需要将实体或 DTO 转换为 XML 对象时,它都会创建一个新的 Marshaller
实例.所以,我认为下面的代码将解决您的问题.希望对你有帮助.
You must notice that I've created my own HttpMessageConverter to solve the problem. That's because Spring uses it's own converter that creates a new Marshaller
instance everytime it needs to convert a entity or a DTO to XML objetct. So, I think the code below will solve your problem. Hope it helps you.
import com.sun.xml.internal.bind.marshaller.CharacterEscapeHandler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.xml.MarshallingHttpMessageConverter;
import org.springframework.oxm.jaxb.Jaxb2Marshaller;
@Configuration
public class XmlParseConfig {
@Bean
public Jaxb2Marshaller getJaxb2Marshaller() {
Jaxb2Marshaller jaxb2Marshaller = new Jaxb2Marshaller();
Map<String, Object> map = new HashMap<String, Object>();
map.put("jaxb.formatted.output", true);
jaxb2Marshaller.setPackagesToScan("com.odr.core.action");
map.put("com.sun.xml.internal.bind.marshaller.CharacterEscapeHandler",
new CharacterEscapeHandler() {
@Override
public void escape(char[] ac, int i, int j, boolean flag,
Writer writer) throws IOException {
writer.write(ac, i, j);
}
});
jaxb2Marshaller.setMarshallerProperties(map);
org.springframework.oxm.Marshaller marshaller = jaxb2Marshaller;
FileOutputStream fos = null;
try {
fos = new FileOutputStream(selectedFile);
marshaller.marshal(book, new StreamResult(fos));
} catch (Exception e) {
e.printStackTrace();
} finally {
if (fos != null) {
fos.close();
}
}
return jaxb2Marshaller;
}
@Bean
public MarshallingHttpMessageConverter getMarshallingHttpMessageConverter() {
return new MarshallingHttpMessageConverter(getJaxb2Marshaller());
}
}
这篇关于Spring中XML编组中的强制转义特殊字符的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:Spring中XML编组中的强制转义特殊字符


- Eclipse 插件更新错误日志在哪里? 2022-01-01
- 从 finally 块返回时 Java 的奇怪行为 2022-01-01
- Safepoint+stats 日志,输出 JDK12 中没有 vmop 操作 2022-01-01
- Java包名称中单词分隔符的约定是什么? 2022-01-01
- C++ 和 Java 进程之间的共享内存 2022-01-01
- 如何使用WebFilter实现授权头检查 2022-01-01
- Jersey REST 客户端:发布多部分数据 2022-01-01
- 将log4j 1.2配置转换为log4j 2配置 2022-01-01
- Spring Boot连接到使用仲裁器运行的MongoDB副本集 2022-01-01
- value & 是什么意思?0xff 在 Java 中做什么? 2022-01-01