当前位置: 首页 > 知识库问答 >
问题:

杰克逊序列化器没有调用泽西Jax-RS

闻人仲渊
2023-03-14

开发JAX-RS应用程序并解决问题。需要从我的资源中自定义json输出以使用Jackson(2.22.2)解析器而不是默认Moxy(根据此答案)。

这是pom。xml片段

        <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.glassfish.jersey</groupId>
                <artifactId>jersey-bom</artifactId>
                <version>${jersey.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.glassfish.jersey.containers</groupId>
            <artifactId>jersey-container-servlet-core</artifactId>
            <!-- use the following artifactId if you don't need servlet 2.x compatibility -->
            <!-- artifactId>jersey-container-servlet</artifactId -->
        </dependency>

        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-json-jackson</artifactId>
            <version>2.25.1</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.5.3</version>
        </dependency>
    </dependencies>
    <properties>
        <jersey.version>2.22.2</jersey.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

我还配置web.xml文件默认使用Jackson

    <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>
                com.mycompany.myresourcepackage
                com.fasterxml.jackson.jaxrs
            </param-value>
        </init-param>

但是资源输出与我使用注释和序列化器配置的有所不同。这是表示为json的模型

    @XmlRootElement(name = "geo")
public class Geometry {
    public Geometry() { 
        coordinates = new ArrayList<List<Double>>();
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    @JsonSerialize(using = CoordinatesSerializer.class)
    public List<List<Double>> getCoordinates() {
        return coordinates;
    }

    public void setCoordinates( List<List<Double>> coordinates) {
        this.coordinates = coordinates;
    }

    @JsonProperty("tp")
    private String  type;
    private List<List<Double>> coordinates;
}

和序列化程序

protected CoordinatesSerializer(Class<List<List<Double>>> t) { }

private static final long serialVersionUID = 1L;

@Override
public void serialize(List<List<Double>> value, JsonGenerator jgen, SerializerProvider provider)
        throws IOException, JsonGenerationException {
    try {
        jgen.writeArrayFieldStart("motherfucking-coordinates");

        int coordinates_size = value.size();
        for (int i = 0; i < coordinates_size; i++) {
            jgen.writeStartArray();
            jgen.writeNumber(value.get(i).get(0));
            jgen.writeNumber(value.get(i).get(1));
            jgen.writeEndArray();
        }

        jgen.writeEndArray();
    }
    catch (Exception e) {
        e.printStackTrace();
    }
}

}

这是资源片段

 @GET
    @Path("/route/{id}")
    @Produces(MediaType.APPLICATION_JSON)
    public Geometry(@PathParam("id") int id) {
    // construct and return object
}

响应json根本不是定制的。

{"geometry":{"coordinates":["27.56 53.9","27.58 53.88","27.55 53.94"],"type":"LineString"},"id":"1","type":"Feature"}

期望的输出是

{"geometry":{"coordinates":[[27.56, 53.9],[27.58, 53.88],[27.55, 53.94]],"type":"LineString"},"id":"1","type":"Feature"}

谢谢。

共有1个答案

山高峰
2023-03-14

我终于设法将泽西项目配置为使用Jackson JSON解析器而不是Moxy(默认)。该应用程序在Glassfish JEE Server上运行。

Maven依赖项

    <dependencies>
    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet-core</artifactId>
        <!-- use the following artifactId if you don't need servlet 2.x compatibility -->
        <!-- artifactId>jersey-container-servlet</artifactId -->
        <version>${jersey.version}</version>
    </dependency>

    <dependency>
        <groupId>com.fasterxml.jackson.jaxrs</groupId>
        <artifactId>jackson-jaxrs-json-provider</artifactId>
        <version>2.5.3</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.5.3</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-jackson</artifactId>
        <version>2.0</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

比你需要创建类扩展org.glassfish.jersey.server.ResourceConfig。类的对象是在第一次加载应用程序时创建的。

public class MyApplication extends ResourceConfig {
public MyApplication() {
    // create custom ObjectMapper
    ObjectMapper mapper = new ObjectMapper();
    mapper.enable(SerializationFeature.INDENT_OUTPUT);

    // create JsonProvider to provide custom ObjectMapper
    JacksonJaxbJsonProvider provider = new JacksonJaxbJsonProvider();
    provider.setMapper(mapper);

    register(provider);
    register(JacksonFeature.class);
    packages("your.resources.package");
}
}

并且创建的MyApplication类应该注册在web.xml文件中(实际创建)。编辑部分web.xml.

<servlet>
    <servlet-name>App</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value>your.app.package.MyApplication</param-value>

    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

列出的步骤足以将Jackson JSON Parser注册为泽西Jax-RS应用程序的默认值。

 类似资料:
  • 问题内容: 我有以下课程- 我正在使用objectMapper.valueToTree(sections)将其转换为JsonNode。但是,当我打印相同的内容时,我仅从Entity类中看到id和name字段,而从Images列表中看不到任何内容。我是否需要添加任何种类的特殊逻辑或注释以确保同时打印列表。 以下是主要课程- 问题答案: 您需要为Entity#images添加getter和setter

  • 我试图能够定义以下代码: 我知道我需要使用: 要正确设置对象映射器,以便能够在rest资源上接受单个值作为数组。我成功地安装了那个部件。 我对这种方法的问题是,以下内容是不可区分的: 和 将产生一个大小为1的列表。然后,在方法create(List myObjects)中,我将无法区分List和发送到Rest资源的单个对象。 那么,我的问题是如何做到这一点。我们的想法是只有一个@POST同时接受数

  • 有没有办法让Jackson序列化某个流对象(并在之后关闭)?这样地: 使现代化 澄清:我想流式传输内容,而不仅仅是将其序列化到单个String对象。

  • 我有一个带有以下注释的类: 我尝试的是忽略反序列化的json。但它不起作用。始终在 JSON 字符串到达时,Jackson lib 将填充 references 属性。如果我只使用@JsonIgnore注释,则 getter 不起作用。这个问题有什么解决方案吗? 谢啦

  • 问题内容: 我需要设置班级日期序列化的格式。我有Jackson的版本,没有@JsonFormat。这就是为什么我编写自定义类的原因: } 并使用它: 但是,我还有另一个具有不同日期格式的字段,并且我不想创建用于序列化的其他类。我可以将所有需要的格式(例如常量)添加到CDJsonDateSerializer类中,并通过注释设置所需的格式吗?像这样: 。 下面的答案后: 经过一些更正后,它可以工作。我

  • 我一直想知道JacksonFeature。泽西2.17仍然需要上课。我看不出JacksonFeature代码之间的输出有任何区别。类是否已注册。 然后,我从codingpedia中分叉了一个代码,删除了JacksonFeature.class,升级到Spring 4.1.2和jersey 2.17,更新了代码,测试仍然通过。 因此,我创建了一个非常简单的web服务来再次测试这个github链接,考