EclipseLink MOXy с Spring MVC для служб RESTful не работает для JSON

Вот ситуация.

Когда я использую EclipseLink MOXy с Spring 3 MVC для генерации JSON вывод, он выдает следующее исключение, когда я пытаюсь установить тип носителя json со следующим оператором.

marshaller.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-вывода для других служб в приложении. Вот объявление bean-компонентов в application-context.xml для того же самого.

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


person Navin    schedule 17.07.2012    source источник


Ответы (1)


Примечание. Я EclipseLink JAXB (MOXy) руководитель и член JAXB (JSR-222) группа экспертов.

Привязка JSON была добавлена ​​в EclipseLink в версии 2.4, и вы используете WebLogic 10.3.4 (11g), который содержит EclipseLink 2.1.2. Рекомендуемое решение этой проблемы — создать разделяемую библиотеку в WebLogic для новой версии EclipseLink.

СОЗДАЙТЕ ОБЩУЮ БИБЛИОТЕКУ

WebLogic использует концепцию общих библиотек. Они развернуты как 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>

Тестовый сервлет

Ниже приведен тестовый сервлет, который вы можете включить в 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 {
    }

}

Для получения дополнительной информации

person bdoughan    schedule 17.07.2012
comment
Я использую версию eclipselink 2.4.0. Мой тестовый пример без какой-либо зависимости Spring MVC отлично работает для вывода json, но не работает в моем веб-приложении с Spring MVC. мне нужно позаботиться о любой другой банке или ее версии? - person Navin; 17.07.2012
comment
@Navin - Какую версию WebLogic вы развертываете? Установка WebLogic включает EclipseLink, поэтому более ранняя версия может быть взята оттуда. - person bdoughan; 17.07.2012
comment
Спасибо за ответ Блейз. Мне все еще нужно попробовать это. Я дам вам знать, если это сработает. Итак, вы упомянули о развертывании weblogic-application.xml как части файла .ear. Но я развертываю веб-приложение (.war), поэтому записи, которые вы упомянули для weblogic-application.xml, должны быть в файле weblogic.xml для веб-приложения? - person Navin; 23.07.2012
comment
@Navin - Вам нужно будет обернуть ВОЙНУ в УХО. Я не смог получить эту работу, указав общую библиотеку в файле weblogic.xml. - person bdoughan; 23.07.2012
comment
Спасибо, Блейз. Я заверну войну в УХО. - person Navin; 24.07.2012