CXF REST的区分大小写发布了XML

时间:2016-11-17 18:51:27

标签: java xml cxf

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

有没有办法让XML(通常是服务创建的实体的编组表示)可以不区分大小写?

如果有必要,我当然可以发布实体类,服务及其注释的示例,但如果实体中的实例变量为private String firstName,则必须为<firstName>...</firstName>,不是<firstname>...</firstname>但是我想让后者能够做好准备。

1 个答案:

答案 0 :(得分:1)

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

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

2 - 阅读传入的内容,提取XML,并使用StreamReaderDelegate处理它以转换为小写

3 - 用输出

替换Message中的内容

JAXB标签应为小写,因此流媒体可以轻松转换它们,并由JAXB unmarshaller处理。在您的示例private String firstName中,XML标记必须是<firstname>...</firstname>而不是<firstName>...</firstName>

CXF Interceptor

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> 

Case Insensitive StreamReaderDelegate

我认为您可以使用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();
    }