在XmlElement

时间:2015-05-26 15:19:53

标签: java xml jaxb

我目前正在开发一个Java WebService项目。

想象一下,我有这个课程:

@XmlRootElement
public class person{

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
 }

所以,我的Request对象看起来像是:

<person>
    <name>Something</name>
</person>

但我希望与之合作:

<PERSON>
    <NAME>Something</NAME>
</PERSON>

,即不区分大小写。

我知道这个问题已经由几个人提出。 用于回答此问题的链接是:

http://blog.bdoughan.com/2010/12/case-insensitive-unmarshalling.html

这篇文章有几年(+ 5年),所以我不知道是否有一个特殊的注释用于此目的,如:

@XmlElement(lower-case(name="No matter what you InTroDuCe i allways be introduce"))
 public String getName() {
            return name;
 }

修改

我提供的链接获取.xml文件。我不想使用XML文件,因为我需要编组y请求Java对象到XML。所以我的问题是:

可以使用Filter类并将我的HttpServletRequest更改为小写,还是有更好的方法?

我的过滤器类(由Netbeans生成):

public class NewFilter implements Filter {

    private static final boolean debug = true;

    // The filter configuration object we are associated with.  If
    // this value is null, this filter instance is not currently
    // configured. 
    private FilterConfig filterConfig = null;

    public NewFilter() {
    }    

    private void doBeforeProcessing(ServletRequest request, ServletResponse response)
            throws IOException, ServletException {
        if (debug) {
            log("NewFilter:DoBeforeProcessing");
        }

    // Write code here to process the request and/or response before
        // the rest of the filter chain is invoked.
    // For example, a logging filter might log items on the request object,
        // such as the parameters.
    /*
         for (Enumeration en = request.getParameterNames(); en.hasMoreElements(); ) {
         String name = (String)en.nextElement();
         String values[] = request.getParameterValues(name);
         int n = values.length;
         StringBuffer buf = new StringBuffer();
         buf.append(name);
         buf.append("=");
         for(int i=0; i < n; i++) {
         buf.append(values[i]);
         if (i < n-1)
         buf.append(",");
         }
         log(buf.toString());
         }
         */
    }    

    private void doAfterProcessing(ServletRequest request, ServletResponse response)
            throws IOException, ServletException {
        if (debug) {
            log("NewFilter:DoAfterProcessing");
        }

    // Write code here to process the request and/or response after
        // the rest of the filter chain is invoked.
    // For example, a logging filter might log the attributes on the
        // request object after the request has been processed. 
    /*
         for (Enumeration en = request.getAttributeNames(); en.hasMoreElements(); ) {
         String name = (String)en.nextElement();
         Object value = request.getAttribute(name);
         log("attribute: " + name + "=" + value.toString());

         }
         */
    // For example, a filter might append something to the response.
    /*
         PrintWriter respOut = new PrintWriter(response.getWriter());
         respOut.println("<P><B>This has been appended by an intrusive filter.</B>");
         */
    }

    /**
     *
     * @param request The servlet request we are processing
     * @param response The servlet response we are creating
     * @param chain The filter chain we are processing
     *
     * @exception IOException if an input/output error occurs
     * @exception ServletException if a servlet error occurs
     */
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain)
            throws IOException, ServletException {

        if (debug) {
            log("NewFilter:doFilter()");
        }

        doBeforeProcessing(request, response);

        Throwable problem = null;
        try {
            chain.doFilter(request, response);
        } catch (Throwable t) {
        // If an exception is thrown somewhere down the filter chain,
            // we still want to execute our after processing, and then
            // rethrow the problem after that.
            problem = t;
            t.printStackTrace();
        }

        doAfterProcessing(request, response);

    // If there was a problem, we want to rethrow it if it is
        // a known type, otherwise log it.
        if (problem != null) {
            if (problem instanceof ServletException) {
                throw (ServletException) problem;
            }
            if (problem instanceof IOException) {
                throw (IOException) problem;
            }
            sendProcessingError(problem, response);
        }
    }

    /**
     * Return the filter configuration object for this filter.
     */
    public FilterConfig getFilterConfig() {
        return (this.filterConfig);
    }

    /**
     * Set the filter configuration object for this filter.
     *
     * @param filterConfig The filter configuration object
     */
    public void setFilterConfig(FilterConfig filterConfig) {
        this.filterConfig = filterConfig;
    }

    /**
     * Destroy method for this filter
     */
    public void destroy() {        
    }

    /**
     * Init method for this filter
     */
    public void init(FilterConfig filterConfig) {        
        this.filterConfig = filterConfig;
        if (filterConfig != null) {
            if (debug) {                
                log("NewFilter:Initializing filter");
            }
        }
    }

    /**
     * Return a String representation of this object.
     */
    @Override
    public String toString() {
        if (filterConfig == null) {
            return ("NewFilter()");
        }
        StringBuffer sb = new StringBuffer("NewFilter(");
        sb.append(filterConfig);
        sb.append(")");
        return (sb.toString());
    }

    private void sendProcessingError(Throwable t, ServletResponse response) {
        String stackTrace = getStackTrace(t);        

        if (stackTrace != null && !stackTrace.equals("")) {
            try {
                response.setContentType("text/html");
                PrintStream ps = new PrintStream(response.getOutputStream());
                PrintWriter pw = new PrintWriter(ps);                
                pw.print("<html>\n<head>\n<title>Error</title>\n</head>\n<body>\n"); //NOI18N

                // PENDING! Localize this for next official release
                pw.print("<h1>The resource did not process correctly</h1>\n<pre>\n");                
                pw.print(stackTrace);                
                pw.print("</pre></body>\n</html>"); //NOI18N
                pw.close();
                ps.close();
                response.getOutputStream().close();
            } catch (Exception ex) {
            }
        } else {
            try {
                PrintStream ps = new PrintStream(response.getOutputStream());
                t.printStackTrace(ps);
                ps.close();
                response.getOutputStream().close();
            } catch (Exception ex) {
            }
        }
    }

    public static String getStackTrace(Throwable t) {
        String stackTrace = null;
        try {
            StringWriter sw = new StringWriter();
            PrintWriter pw = new PrintWriter(sw);
            t.printStackTrace(pw);
            pw.close();
            sw.close();
            stackTrace = sw.getBuffer().toString();
        } catch (Exception ex) {
        }
        return stackTrace;
    }

    public void log(String msg) {
        filterConfig.getServletContext().log(msg);        
    }

}

编辑2:

使用@Kenneth Clark的帮助,我做了:

   @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain)
            throws IOException, ServletException {

        if (debug) {
            log("NewFilter:doFilter()");
        }

        doBeforeProcessing(request, response);

        Throwable problem = null;

        try {

            final HttpServletRequestWrapper wrapped = new HttpServletRequestWrapper((HttpServletRequest) request) {

                public String toLowerCase() {

                    StringBuffer jb = new StringBuffer();
                    String line = null;
                    try {
                        BufferedReader reader = request.getReader();
                        while ((line = reader.readLine()) != null) {
                            jb.append(line);
                        }
                    } catch (Exception e) { /*report an error*/ }

                    return jb.toString().toLowerCase();
                }

            };

            chain.doFilter(wrapped, response);
        } catch (IOException | ServletException t) {
            // If an exception is thrown somewhere down the filter chain,
            // we still want to execute our after processing, and then
            // rethrow the problem after that.
            problem = t;
        }

        doAfterProcessing(request, response);

        // If there was a problem, we want to rethrow it if it is
        // a known type, otherwise log it.
        if (problem
                != null) {
            if (problem instanceof ServletException) {
                throw (ServletException) problem;
            }
            if (problem instanceof IOException) {
                throw (IOException) problem;
            }
            sendProcessingError(problem, response);
        }
    }

但我仍然没有要求降低案件。我做错了什么?

2 个答案:

答案 0 :(得分:1)

要阅读HttpServletRequest的内容,您可以执行以下操作,

    StringBuffer stringBuffer = new StringBuffer();
    String line = null;
    try {
        BufferedReader reader = httpServletRequest.getReader();
        while ((line = reader.readLine()) != null) {
            stringBuffer.append(line);
        }
    } catch (Exception e) { e.printStackTrace(); /// Do something with this }       

然后,您可以调用包含XSL变通方法的方法来执行转换

String transformedXML = transformTheXmlString(stringBuffer.toString());

以下是XSL解决方法,下面的示例将低级大写转换为大写

   <xsl:element name="{translate(local-name(),$lcase,$ucase)}">

翻转$ lcase,$ ucase切换案例

public class Transform {

    public static void main(String[] args) throws TransformerException {
        String inXMl = "<test>CamelCase</test>";

        StringWriter writer = new StringWriter();
        String inputXSLFile = "C:\\text.xsl";

        TransformerFactory factory = TransformerFactory.newInstance();
        StreamSource xslStream = new StreamSource(new File(inputXSLFile));
        Transformer transformer = factory.newTransformer(xslStream);

        StreamSource in = new StreamSource(new StringReader(inXMl));
        StreamResult out = new StreamResult(writer);
        transformer.transform(in, out);
        System.out.println(writer.toString());
    }
}

从XSL字符串转换

public class Transform {

    public static void main(String[] args) throws TransformerException {
        String inXMl = "<test>CamelCase</test>";

        StringWriter writer = new StringWriter();
        String inputXSL = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n" +
                "<xsl:stylesheet version=\"1.0\"\n" +
                "                xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\">\n" +
                "    <xsl:variable\n" +
                "            name=\"lcase\">abcdefghijklmnopqrstuvwxyz\n" +
                "    </xsl:variable>\n" +
                "    <xsl:variable\n" +
                "            name=\"ucase\">ABCDEFGHIJKLMNOPQRSTUVWXYZ\n" +
                "    </xsl:variable>\n" +
                "\n" +
                "    <xsl:template match=\"@*|node()\">\n" +
                "        <xsl:copy>\n" +
                "            <xsl:apply-templates select=\"@*|node()\"/>\n" +
                "        </xsl:copy>\n" +
                "    </xsl:template>\n" +
                "    <xsl:template match=\"*\">\n" +
                "        <xsl:element name=\"{translate(local-name(),$lcase,$ucase)}\">\n" +
                "            <xsl:apply-templates select=\"@*|node()\"/>\n" +
                "        </xsl:element>\n" +
                "    </xsl:template>\n" +
                "</xsl:stylesheet>";

        TransformerFactory factory = TransformerFactory.newInstance();
        StreamSource xslStream = new StreamSource(new StringReader(inputXSL));
        Transformer transformer = factory.newTransformer(xslStream);

        StreamSource in = new StreamSource(new StringReader(inXMl));
        StreamResult out = new StreamResult(writer);
        transformer.transform(in, out);
        System.out.println(writer.toString());
    }
}

<强> XSL

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:variable
            name="lcase">abcdefghijklmnopqrstuvwxyz
    </xsl:variable>
    <xsl:variable
            name="ucase">ABCDEFGHIJKLMNOPQRSTUVWXYZ
    </xsl:variable>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="*">
        <xsl:element name="{translate(local-name(),$lcase,$ucase)}">
            <xsl:apply-templates select="@*|node()"/>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

XSL Exerpt from: http://helpdesk.objects.com.au/java/how-to-convert-all-xml-element-names-to-lower-case

答案 1 :(得分:0)

您可以通过一些解决方法实现此目的:在小写中映射所有您的节点名称属性,并创建自己的XMLStreamReader包装程序,调用{{1}在它返回的所有属性/元素名称上。