【问题标题】:EclipseLink MOXy with spring MVC for RESTful services not working for JSONEclipseLink MOXy with spring MVC for RESTful services 不适用于 JSON
【发布时间】:2012-07-17 15:22:01
【问题描述】:

情况如下。

当我使用 EclipseLink MOXy 和 Spring 3 MVC 生成 JSON 输出时,当我尝试使用以下语句设置 json 媒体类型时,它会引发以下异常。

ma​​rshaller.setProperty(JAXBContextProperties.MEDIA_TYPE, "application/json");

javax.xml.bind.PropertyException: name: eclipselink.media-type value: application/json
    at org.eclipse.persistence.jaxb.JAXBMarshaller.setProperty(JAXBMarshaller.java:520)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176)
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:436)
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:424)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:669)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:574)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
    at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
    at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)

我也在使用 JAXBviews 为应用程序中的其他服务生成 xml 输出。这是 application-context.xml 中的 beans 声明。

<bean id="jaxbMarshaller"    class="com.abc.restws.marshallers.ClasspathScanningJaxb2Marshaller">
    <property name="basePackages" ref="jaxbBasePackages" />
</bean> 


    <bean id="jaxbMarshallingView" class="org.springframework.web.servlet.view.xml.MarshallingView">
        <property name="marshaller" ref="jaxbMarshaller"/>
    </bean> 
    <bean id="jaxbJsonMarshallingView" class="org.springframework.web.servlet.view.xml.MarshallingView">
        <property name="contentType" value="application/json"/>
        <property name="marshaller" ref="jaxbJsonMarshaller"/>
    </bean> 

这个错误的原因是什么?我该如何解决这个错误? XML 输出生成良好,但对于 JSON,它会引发此异常。您可以在异常详细信息中看到它也使用正确的 JAXBMarshaller 类来设置 json 媒体类型。请指教。

“org.eclipse.persistence.jaxb.JAXBMarshaller.setProperty(JAXBMarshaller.java:520)”

【问题讨论】:

    标签: java eclipselink weblogic-10.x moxy


    【解决方案1】:

    注意:我是EclipseLink JAXB (MOXy) 领导,也是JAXB (JSR-222) 专家组的成员。

    JSON 绑定在 2.4 版中添加到 EclipseLink,您使用的是包含 EclipseLink 2.1.2 的 WebLogic 10.3.4 (11g)。此问题的推荐解决方案是在 WebLogic 中为较新版本的 EclipseLink 创建一个共享库。

    创建共享库

    WebLogic 具有shared libraries 的概念。这些被部署为 EAR。下面是 EAR 为 EclipseLink 2.4 创建共享库时的样子。

    EclipseLink24.ear

    • lib/eclipselink.jar
    • META-INF/application.xml
    • META-INF/MANIFEST.MF
    • META-INF/weblogic-application.xml

    application.xml

    <application>
      <display-name>EclipseLink 2.4 Shared Library</display-name>
      <module>
        <java></java>
      </module>
    </application>
    

    MANIFEST.MF

    Manifest-Version: 1.0
    Ant-Version: Apache Ant 1.8.2
    Created-By: 1.7.0_04-b21 (Oracle Corporation)
    Extension-Name: EclipseLink-2.4.0
    Specification-Version: 2.4.0
    Implementation-Version: 2.4.0.v20120608-r11652
    

    weblogic-application.xml

    <weblogic-application>
      <prefer-application-packages>
        <package-name>org.eclipse.persistence.*</package-name>
      </prefer-application-packages>
    </weblogic-application>
    

    使用共享库

    部署共享库后,您需要配置企业应用程序以使用它。

    SampleApplication.ear

    • META-INF/MANIFEST.MF
    • META-INF/weblogic-application.xml
    • SampleApplication.war

    weblogic-application.xml

    weblogic-application.xml 文件用于引用共享库。 library-ref 元素中的条目需要与共享库中 MANIFEST.MF 中的相应条目匹配。

    <?xml version="1.0" encoding="UTF-8"?>
    <wls:weblogic-application xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-application" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/javaee_5.xsd http://xmlns.oracle.com/weblogic/weblogic-application http://xmlns.oracle.com/weblogic/weblogic-application/1.2/weblogic-application.xsd">
        <!--weblogic-version:10.3.4-->
        <wls:application-param>
            <wls:param-name>webapp.encoding.default</wls:param-name>
            <wls:param-value>UTF-8</wls:param-value>
        </wls:application-param>
        <wls:library-ref>
            <wls:library-name>EclipseLink-2.4.0</wls:library-name>
            <wls:specification-version>2.4.0</wls:specification-version>
            <wls:implementation-version>2.4.0.v20120608-r11652</wls:implementation-version>
            <wls:exact-match>true</wls:exact-match>
        </wls:library-ref>
    </wls:weblogic-application>
    

    TestServlet

    下面是一个测试 servlet,您可以将其包含在 WAR 中以测试 EclipseLink 版本。

    package com.example;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class TestServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;
    
        public TestServlet() {
            super();
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            response.setContentType("text/html");
            PrintWriter out = response.getWriter();
            out.append("<html><body>");
            out.append(org.eclipse.persistence.Version.getVersion());
            out.append("</body></html>");
        }
    
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        }
    
    }
    

    更多信息

    【讨论】:

    • 我使用的是 2.4.0 版本的 eclipselink。我没有任何 spring mvc 依赖的测试用例适用于 json 输出,但它不适用于我的带有 spring mvc 的 webapp。我需要处理任何其他 jar 或它的版本吗?
    • @Navin - 您部署到哪个版本的 WebLogic? WebLogic 安装包括 EclipseLink,因此早期版本可能来自那里。
    • 感谢布莱斯的回复。我仍然需要尝试这个。我会让你知道它是否有效。因此,您提到将 weblogic-application.xml 部署为 .ear 文件的一部分。但我正在部署一个 Web 应用程序 (.war),所以你提到的 weblogic-application.xml 条目应该在 web 应用程序的 weblogic.xml 文件中?
    • @Navin - 您需要将 WAR 包装在 EAR 中。我无法通过在 weblogic.xml 文件中指定共享库来完成这项工作。
    • 谢谢布莱斯。我会用 EAR 来结束这场战争。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-11
    • 1970-01-01
    • 2017-07-29
    • 1970-01-01
    • 2018-04-19
    • 2014-12-23
    • 1970-01-01
    相关资源
    最近更新 更多