作为结果(如果有必要,我可以通过代码示例进行阐述),我刚刚意识到我的REST
API是用Java编写的,由CXF
提供并由Tomcat 7
提供在发布XML
内容时,区分大小写。
有没有办法让XML(通常是服务创建的实体的编组表示)可以不区分大小写?
如果有必要,我当然可以发布实体类,服务及其注释的示例,但如果实体中的实例变量为private String firstName
,则必须为<firstName>...</firstName>
,不是<firstname>...</firstname>
但是我想让后者能够做好准备。
答案 0 :(得分:1)
完整的解决方案涉及大量工作,但完全可能。按照@matiaselgart发布的链接,一般的解决方案是
1 - 添加CXF拦截器来操纵Message
2 - 阅读传入的内容,提取XML,并使用StreamReaderDelegate
处理它以转换为小写
3 - 用输出
替换Message中的内容 JAXB标签应为小写,因此流媒体可以轻松转换它们,并由JAXB unmarshaller处理。在您的示例private String firstName
中,XML标记必须是<firstname>...</firstname>
而不是<firstName>...</firstName>
。
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>
我认为您可以使用here中的StreamReaderDelegate
并使用此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();
}