当前位置: 首页 > 面试题库 >

泽西JSON序列化

长孙阳成
2023-03-14
问题内容

我设置了一个Eclipse WebApp项目,并将Jersey和Jackson JAR放在WEB-INF /
lib目录中。我想使用JSON序列化,但无法解决此错误:

MessageBodyWriter not found for media type=application/json, type=class com.rest.Greeting, genericType=class com.rest.Greeting. I already googled much but all the solutions are updated or don't solve my issue. Here is the structure of my project:

WEB-INF / lib目录 文件夹包含以下JAR:

aopalliance-repackaged-2.3.0-b10.jar
asm-debug-all-5.0.2.jar
cglib-2.2.2.jar
datafactory-0.8.jar
hk2-api-2.3.0-b10.jar
hk2-locator-2.3.0-b10.jar
hk2-utils-2.3.0-b10.jar
jackson-annotations-2.4.0.jar
jackson-core-2.4.0.jar
jackson-databind-2.4.0.jar
jackson-jaxrs-base-2.4.0.jar
jackson-jaxrs-json-provider-2.4.0.jar
jackson-module-jaxb-annotations-2.4.0.jar
javassist-3.18.1-GA.jar
javax.annotation-api-1.2.jar
javax.inject-2.3.0-b10.jar
javax.servlet-api-3.0.1.jar
javax.ws.rs-api-2.0.1.jar
jaxb-api-2.2.7.jar
jersey-client.jar
jersey-common.jar
jersey-container-servlet-core.jar
jersey-container-servlet.jar
jersey-guava-2.13.jar
jersey-server.jar
org.osgi.core-4.2.0.jar
osgi-resource-locator-1.0.1.jar
persistence-api-1.0.jar
validation-api-1.1.0.Final.jar

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>Rest Test</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <servlet-name>Greeting</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>com.rest</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>Greeting</servlet-name>
    <url-pattern>/greet/*</url-pattern>
  </servlet-mapping>
</web-app>

Greeting.java

@XmlRootElement
@Path("/greeting")
public class Greeting {

    private String greeting;

    public Greeting() {
        this.setGreeting("hello");
    }

    @GET
    @Produces(MediaType.TEXT_XML)   
    public Greeting sayHello() {
        return new Greeting();
    }

    public String getGreeting() {
        return greeting;
    }

    public void setGreeting(String greeting) {
        this.greeting = greeting;
    }

}

WebApp项目在嵌入式Tomcat v7服务器中运行(在eclipse中查看“服务器”)。 要求

http://localhost:8080/com.rest/greet/greeting

只要使用 MediaType.TEXT_XML ,就不会出现错误,并且内容如下所示:

<greeting>
<greeting>hello</greeting>
</greeting>

当我将MediaType更改为 “ MediaType.APPLICATION_JSON”时
,将引发以下异常(如上所述)。我已经注意到,它取决于批注“ @XmlRootElement”,但没有类似“
JsonRootElement”的东西,而jackson / genson API声称它可以直接使用(由于自动注册机制)。您有解决的办法吗?

每个帮助都非常非常感谢!谢谢你哥比


问题答案:

您只需要注册即可JacksonJsonProvider。有很多方法可以实现:

  1. 在web.xml中明确注册JacksonJsonProvider:


    jersey.config.server.provider.classnames
    com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider

要么

  1. javax.ws.rs.core.Application在web.xml中注册扩展的类


    javax.ws.rs.Application
    com.rest.MyApplication

然后在应用程序类中进行所有配置:

package com.rest;

import org.glassfish.jersey.server.ResourceConfig;
import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider;

public class MyApplication extends ResourceConfig {

    public MyApplication() {
        packages("com.rest");
        register(JacksonJsonProvider.class);
    }

ResourceConfig是的子类,javax.ws.rs.Application并提供一些帮助方法,使注册变得容易。

要么

  1. 使用自动注册。只需添加依赖项即可jersey-media-json-jackson


    org.glassfish.jersey.media
    jersey-media-json-jackson
    2.13

但小心点。它将注册超过您所需的数量:

  • JacksonJaxbJsonProvider,
  • JsonParseExceptionMapper,
  • JsonMappingExceptionMapper

查看源代码以查看其功能。



 类似资料:
  • 我正在尝试使用JAX-RS(Jersey)构建JSON RESTful Webservice。我也在使用Maven构建应用程序。 我的第一个方法是 pom之后。xml- 所以我补充道 到我的pom文件。其他lib文件(例如jackson-cors-asl-1.7.1.jar、jackson-jaxrs-1.7.1.jar、jaxb impl,…)也可以在生成的war文件中找到//编辑:它还下载st

  • 我在解析JSON到日期对象时遇到一个问题。

  • 下面的代码有效 下面的代码是抛出错误 低于异常 [[FATAL]找不到public javax类型参数的注入源。ws。rs.core。回复com。特里姆布尔。帕斯。大声点。metricscollector。资源MetricsResource。索引1处的PostMetricData(java.lang.String,java.lang.String)。;source='ResourceMethod{

  • 问题内容: 我正在尝试将以下有效负载发布到基于泽西岛的Web服务中: 我的泽西岛代码: 就在Jersey打电话给我时,我停了下来,我看到 当面的 地址正好与我要查找的内容(上面的JSON中的内容)完全冲了出来。但是,我的数据元组不存在。我知道Jersey正在为 Address es 调用我的no- arg构造函数,并且它的setter也被调用了,但是我晚上仍无法解决Jersey可能会或可能不会尝试

  • 我目前使用的是球衣 我现在要做的是设置泽西,这样当查询参数进来时(比如缩进),我可以告诉Jackson以“更漂亮的格式,也就是缩进”序列化JSON。您可以通过使用SerializationConfig.Feature.INDENT_OUTPUT配置JSON映射器来轻松地告诉Jackson这样做。 问题是,我如何在每个请求的基础上获取一个queryparam并使用它来修改Jackson的输出?

  • 我正在尝试将以下有效负载发布到我基于Jersey的web服务: 我的泽西岛代码: 就在Jersey给我打电话的时候,我停下了,我看到了我正在寻找的地址(上面JSON中的内容)。然而,我的数据元组不在那里。我知道Jersey正在为地址es调用我的无参数构造函数,它的setters也在被调用,但是我还没睡,因为Jersey可能会也可能不会尝试对JSON中的这些随机("数据")元组做些什么。(我说“随机