gpt4 book ai didi

java - CXF REST 发布 XML 的区分大小写

转载 作者:行者123 更新时间:2023-11-30 07:02:29 25 4
gpt4 key购买 nike

作为结果(如果需要,我可以通过代码示例进行阐述),我刚刚意识到我的 REST API,用Java编写,由CXF提供由 Tomcat 7 提供服务发帖时区分大小写 XML内容。

是否有任何方法可以使 XML(通常是服务创建的实体的编码表示形式)不区分大小写?

如果有必要,我当然可以发布实体类、服务及其注释的示例,但作为最低限度,如果实体中的实例变量是 private String firstName ,XML 标记必须是 <firstName>...</firstName>而不是<firstname>...</firstname>但我想让后者可以编码。

最佳答案

完整的解决方案涉及大量工作,但这是完全可能的。按照@matiaselgart发布的链接,一般解决方案是

1 - 添加 CXF 拦截器来操作 Message

2 - 读取传入内容,提取 XML,并使用 StreamReaderDelegate 对其进行处理转换为小写

3 - 将 Message 中的内容替换为输出

JAXB 标记应为小写,以便流送器可以轻松转换它们,并由 JAXB 解码器处理。在您的示例中 private String firstName ,XML 标记必须是 <firstname>...</firstname>而不是<firstName>...</firstName>

CXF拦截器

public class CaseInsensitiveInterceptor extends AbstractPhaseInterceptor<Message> {
public CaseInsensitiveInterceptor () {
super(Phase.RECEIVE);
}

public void handleMessage(Message message) {
//Get the message body as input stream, process the xml, and set a new non-consumed inputStream into Message
InputStream in = message.getContent(InputStream.class);
InputStream bin = xmlToLowerCase (in);
message.setContent(InputStream.class, bin);
}

public void handleFault(Message messageParam) {
//Invoked when interceptor fails
}
}

配置

在总线或提供者中添加拦截器

<bean id="caseInsensitiveInterceptor" class="CaseInsensitiveInterceptor " />
<cxf:bus>
<cxf:inInterceptors>
<ref bean="caseInsensitiveInterceptor"/>
</cxf:inInterceptors>
</cxf:bus>

不区分大小写的 StreamReaderDelegate

我认为你可以使用StreamReaderDelegate来自here并使用此 link 将 XMLStreamReader 转换为 InputStream 。方法xmlToLowerCase从拦截器调用

警告:我尚未测试这部分代码。

private static class MyStreamReaderDelegate extends StreamReaderDelegate {

public MyStreamReaderDelegate(XMLStreamReader xsr) {
super(xsr);
}

@Override
public String getAttributeLocalName(int index) {
return super.getAttributeLocalName(index).toLowerCase();
}

@Override
public String getLocalName() {
return super.getLocalName().toLowerCase();
}

}

public InputStream xmlToLowerCase (InputStream in){
XMLInputFactory xif = XMLInputFactory.newInstance();
XMLStreamReader xsr = xif.createXMLStreamReader(in);
xsr = new MyStreamReaderDelegate(xsr);
String xml = getOuterXml(xsr);
return new ByteArrayInputStream (xml.getBytes());
}

//https://coderanch.com/t/478588/XMLStreamReader-InputStream
private String getOuterXml(XMLStreamReader xmlr) throws TransformerConfigurationException,
TransformerFactoryConfigurationError, TransformerException
{
Transformer transformer = TransformerFactory.newInstance().newTransformer();
StringWriter stringWriter = new StringWriter();
transformer.transform(new StAXSource(xmlr), new StreamResult(stringWriter));
return stringWriter.toString();
}

关于java - CXF REST 发布 XML 的区分大小写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40662823/

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