Java CXF-REST-postedxml的大小写敏感性

Java CXF-REST-postedxml的大小写敏感性,java,xml,cxf,Java,Xml,Cxf,作为一个结果(如果有必要,我可以通过代码示例加以阐述),我刚刚意识到,我的RESTAPI是用Java编写的,由CXF提供,由tomcat7提供,在发布XML内容时是区分大小写的 XML通常是服务创建的实体的封送表示,有没有办法使它不区分大小写 如果需要,我当然可以发布实体类、服务及其注释的示例,但如果实体中的实例变量是private String firstName,则至少可以发布这些示例,XML标记必须是..而不是..,但我想让后者成为可能。一个完整的解决方案需要大量的工作,但这是完全可能的。

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

XML通常是服务创建的实体的封送表示,有没有办法使它不区分大小写


如果需要,我当然可以发布实体类、服务及其注释的示例,但如果实体中的实例变量是
private String firstName
,则至少可以发布这些示例,XML标记必须是
..
而不是
..
,但我想让后者成为可能。

一个完整的解决方案需要大量的工作,但这是完全可能的。根据@matiaselgart发布的链接,一般解决方案是

1-添加一个CXF拦截器来处理
消息

2-读取传入内容,提取XML,并使用
StreamReaderDelegate
将其转换为小写

3-用输出替换消息中的内容

JAXB标记应该是小写的,因此拖缆可以轻松地转换它们,并由JAXB解组器进行处理。在您的示例中,
私有字符串firstName
,XML标记必须是
..
而不是
..

CXF拦截器
我想这意味着答案是否定的?不,那条评论只涉及XML是否应该区分大小写。您如何解组您的有效负载?不是答案,但可能的线索:。还可以使用CXF拦截器执行您的要求,它可以允许您根据需要对XML进行原始访问。你不想这样做,即使你发现你可以。整个XML生态系统是区分大小写的。
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> 
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();
    }