1

これが状況です。

Spring 3 MVC でEclipseLink MOXyを使用して JSON 出力を生成すると、次のステートメントで json メディア タイプを設定しようとすると、次の例外がスローされます。

marshaller.setProperty(JAXBContextProperties.MEDIA_TYPE, "アプリケーション/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 の Bean 宣言を次に示します。

<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)"

4

1 に答える 1

1

注: 私はEclipseLink JAXB(MOXy)のリーダーであり、JAXB(JSR-222)エキスパートグループのメンバーです。

JSONバインディングはバージョン2.4でEclipseLinkに追加され、EclipseLink2.1.2を含むWebLogic10.3.4(11g)を使用しています。この問題に対する推奨される解決策は、EclipseLinkの新しいリリース用にWebLogicで共有ライブラリを作成することです。

共有ライブラリを作成する

WebLogicには共有ライブラリの概念があります。これらはEARとしてデプロイされます。以下は、EclipseLink2.4の共有ライブラリを作成するためのEARの外観です。

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

以下は、EclipseLinkバージョンをテストするためにWARに含めることができるテストサーブレットです。

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 {
    }

}

詳細については

于 2012-07-17T17:59:08.093 に答える