gpt4 book ai didi

java - 带有 Spring MVC 的 EclipseLink MOXy 用于 RESTful 服务不适用于 JSON

转载 作者:太空宇宙 更新时间:2023-11-04 08:09:14 24 4
gpt4 key购买 nike

情况是这样的。

当我使用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)”

最佳答案

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

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

创建共享库

WebLogic有shared libraries的概念。它们被部署为 EAR。下面是为 EclipseLink 2.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

下面是一个测试 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 {
}

}

了解更多信息

关于java - 带有 Spring MVC 的 EclipseLink MOXy 用于 RESTful 服务不适用于 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11525693/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com