无法获取jersey 2应用程序以使用自定义杰克逊XmlMapper

克韦托米尔·鲁塞诺夫(Cvetomir Rusenov)

我正在使用Jersey 2.22.1和Jackson 2.6.3编写Web应用程序。我的pom.xml看起来像这样:

<!-- JERSEY -->
    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet</artifactId>
        <version>2.22.1</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.core</groupId>
        <artifactId>jersey-client</artifactId>
        <version>2.22.1</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-jackson</artifactId>
        <version>2.22.1</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-multipart</artifactId>
        <version>2.22.1</version>
    </dependency>
    <dependency>
        <groupId>asm</groupId>
        <artifactId>asm</artifactId>
        <version>3.3.1</version>
    </dependency>
    <dependency>
        <groupId>org.codehaus.woodstox</groupId>
        <artifactId>woodstox-core-asl</artifactId>
        <version>4.4.1</version>
    </dependency>
    <!-- JACKSON -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.6.3</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.6.3</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>2.6.3</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.dataformat</groupId>
        <artifactId>jackson-dataformat-xml</artifactId>
        <version>2.6.3</version>
    </dependency>

目标是将不同的自定义ObjectMappers用于JSON和XML映射。我创建了两个提供程序类:JSONMapperProvider

    @Provider
    @Produces(MediaType.APPLICATION_JSON)
    public class JSONMapperProvider implements ContextResolver<ObjectMapper> {
    private static ObjectMapper objectMapper;

    public JSONMapperProvider() {
    init();
    }

    public static void init() {
    if (objectMapper == null) {
        objectMapper = new ObjectMapper();
        // SERIALIZATION
        objectMapper.configure(SerializationFeature.INDENT_OUTPUT, true)
            .configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false)
            .configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false)
            .configure(SerializationFeature.WRITE_DATE_KEYS_AS_TIMESTAMPS, false)
            .setSerializationInclusion(Include.NON_NULL)
            .setSerializationInclusion(Include.NON_EMPTY);
        // DESERIALIZATION
        objectMapper.configure(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS, true)
            .configure(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, true);
        // set up ISO 8601 date/time stamp format:
        ObjectMapperProvider.DATE_FORMAT_ISO8601.setTimeZone(TimeZone.getTimeZone("GMT"));
        objectMapper.setDateFormat(ObjectMapperProvider.DATE_FORMAT_ISO8601);
        // Custom deserializer for date which helps deserialization of date
        // without time
        SimpleModule dateDeserializerModule = new SimpleModule("DateDeserializerModule", Version.unknownVersion());
        dateDeserializerModule.addDeserializer(Date.class, new CustomJsonDateDeserializer());
        //objectMapper.registerModule(dateDeserializerModule);
    }
    }

    @Override
    public ObjectMapper getContext(Class<?> type) {
    System.out.println("JSONMapperProvider.getContext() called with type: "
        + type);
    return objectMapper;
    }

    private static class CustomJsonDateDeserializer extends JsonDeserializer<Date> {
    @Override
    public Date deserialize(JsonParser jsonparser, DeserializationContext deserializationcontext) throws IOException, JsonProcessingException {
        String date = jsonparser.getText();
        try {
        return DateUtil.parseDate(date);
        } catch (ParseException e) {
        throw new RuntimeException(e);
        }
    }
    }
}

和XMLMapperProvider

    @Provider
    @Produces({ MediaType.APPLICATION_XML })
    public class XMLMapperProvider implements ContextResolver<ObjectMapper>     {

    private static ObjectMapper objectMapper;

    public XMLMapperProvider() {
    init();
    }

    public static void init() {
    if (objectMapper == null) {
        JacksonXmlModule module = new JacksonXmlModule();
        module.setDefaultUseWrapper(false);
        objectMapper = new XmlMapper(module);
        // SERIALIZATION
        objectMapper.configure(SerializationFeature.INDENT_OUTPUT, true)
            .configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false)
            .configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false)
            .configure(SerializationFeature.WRITE_DATE_KEYS_AS_TIMESTAMPS, false)
            .setSerializationInclusion(Include.NON_NULL)
            .setSerializationInclusion(Include.NON_EMPTY);
        // DESERIALIZATION
        objectMapper.configure(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS, true)
            .configure(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, true);
        // set up ISO 8601 date/time stamp format:
        ObjectMapperProvider.DATE_FORMAT_ISO8601.setTimeZone(TimeZone.getTimeZone("GMT"));
        objectMapper.setDateFormat(ObjectMapperProvider.DATE_FORMAT_ISO8601);
        // Custom deserializer for date which helps deserialization of date
        // without time
        SimpleModule dateDeserializerModule = new SimpleModule("DateDeserializerModule", Version.unknownVersion());
        dateDeserializerModule.addDeserializer(Date.class, new CustomJsonDateDeserializer());
        objectMapper.registerModule(dateDeserializerModule);
    }
    }

    @Override
    public ObjectMapper getContext(Class<?> type) {
    System.out.println("XMLMapperProvider.getContext() called with type: "
        + type);
    return objectMapper;
    }

    private static class CustomJsonDateDeserializer extends JsonDeserializer<Date> {
    @Override
    public Date deserialize(JsonParser jsonparser, DeserializationContext deserializationcontext) throws IOException, JsonProcessingException {
        String date = jsonparser.getText();
        try {
        return DateUtil.parseDate(date);
        } catch (ParseException e) {
        throw new RuntimeException(e);
        }
    }
    }
}

它们都在同一包中,并在Application资源类中注册

@ApplicationPath("resources")
public class CCRestResources extends ResourceConfig {
    public CCRestResources() {
        register(JacksonFeature.class);
        packages("com.cc.rest.jersey");
    }
}

如果我对@Produces(MediaType.APPLICATION_JSON)的方法发出GET请求,那么一切都很好,并且使用了我的自定义映射器。但是,如果我提出相同的要求,请@Produces(MediaType.APPLICATION_XML)应用程序使用某些默认映射器,而不是我的自定义映射器。如果您有任何想法请帮助。谢谢!

保罗·萨姆索塔

有几件事。首先,您不仅需要核心的Jackson xml依赖关系,还需要实际的jaxrs提供程序

<dependency>
    <groupId>com.fasterxml.jackson.jaxrs</groupId>
    <artifactId>jackson-jaxrs-xml-provider</artifactId>
    <version>${jackson2.version}</version>
</dependency>

然后,您应该排除JAXB提供程序,这是Jersey所使用的默认提供程序。(我在测试时保留它没有问题,但是如果您不打算使用它,我将排除它)。它是由拉jersey-server,所以你应该明确地声明jersey-server,并排除jersey-media-jaxb由它

<dependency>
    <groupId>org.glassfish.jersey.core</groupId>
    <artifactId>jersey-server</artifactId>
    <version>${jersey2.version}</version>
    <exclusions>
        <exclusion>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-jaxb</artifactId>
        </exclusion>
    </exclusions>
</dependency>

然后,您将需要注册JacksonJaxbXMLProvider(或JacksonXMLProvider不需要或计划使用JAXB批注的)。

public CCRestResources() {
    register(JacksonFeature.class);
    register(JacksonJaxbXMLProvider.class);
    packages("com.cc.rest.jersey");
}

最后,您需要将参数ContextResolver化为XmlMapper类型,而不是ObjectMapper可以看出这里的供应商寻找一ContextResolverXmlMapper,没有ObjectMapper

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

杰克逊的Jersey 1.x:自定义响应JSON

来自分类Dev

杰克逊的Jersey 1.x:自定义响应JSON

来自分类Dev

杰克逊:在自定义字段JsonDeserializer中获取整个对象

来自分类Dev

杰克逊-如何从JsonNode获取对象?Jawampa [Web应用程序消息协议-Java

来自分类Dev

获取“无法找到”错误:Angular 2 应用程序中的自定义管道

来自分类Dev

无法使用Tomcat或GlassFish服务器从Java Jersey应用程序获取JSON响应

来自分类Dev

@JsonCreator无法使用杰克逊识别

来自分类Dev

无法使用Qt Assistant从Qt应用程序内部获取自定义帮助文件以进行工作

来自分类Dev

自定义键盘Android获取当前的应用程序

来自分类Dev

无法远程连接到自定义应用程序

来自分类Dev

使用杰克逊获取值的json路径

来自分类Dev

杰克逊无法使用ObjectMapper映射类

来自分类Dev

无法使用Terraform在自定义VPC中创建Elastic Beanstalk应用程序

来自分类Dev

无法使用 React 和 Redux 从自定义组件更新应用程序状态

来自分类Dev

无法使用Tomcat或GlassFish服务器从Java Jersey应用获取JSON响应

来自分类Dev

Laravel 5.4 应用程序无法在自定义目录中加载自定义类

来自分类Dev

coreFlightSystem 的自定义应用程序:“无法加载 cFE 应用程序”

来自分类Dev

无法使用Jersey Webservice

来自分类Dev

无法使用Jersey解析RESTful应用程序中的日期

来自分类Dev

无法使用Jersey解析RESTful应用程序中的日期

来自分类Dev

杰克逊通过字段名称自定义序列化程序?

来自分类Dev

自定义杰克逊解组行为

来自分类Dev

杰克逊自定义号码解析

来自分类Dev

从杰克逊获取未知字段的列表

来自分类Dev

杰克逊无法解析List <Long>

来自分类Dev

杰克逊无法解析List <Long>

来自分类Dev

杰克逊无法识别物业

来自分类Dev

如何在任务窗格应用程序中使用OfficeJ获取/读取自定义文档属性?

来自分类Dev

为什么我的NodeJS应用程序中的自定义MongoDB _id无法使用字符串uuid?

Related 相关文章

  1. 1

    杰克逊的Jersey 1.x:自定义响应JSON

  2. 2

    杰克逊的Jersey 1.x:自定义响应JSON

  3. 3

    杰克逊:在自定义字段JsonDeserializer中获取整个对象

  4. 4

    杰克逊-如何从JsonNode获取对象?Jawampa [Web应用程序消息协议-Java

  5. 5

    获取“无法找到”错误:Angular 2 应用程序中的自定义管道

  6. 6

    无法使用Tomcat或GlassFish服务器从Java Jersey应用程序获取JSON响应

  7. 7

    @JsonCreator无法使用杰克逊识别

  8. 8

    无法使用Qt Assistant从Qt应用程序内部获取自定义帮助文件以进行工作

  9. 9

    自定义键盘Android获取当前的应用程序

  10. 10

    无法远程连接到自定义应用程序

  11. 11

    使用杰克逊获取值的json路径

  12. 12

    杰克逊无法使用ObjectMapper映射类

  13. 13

    无法使用Terraform在自定义VPC中创建Elastic Beanstalk应用程序

  14. 14

    无法使用 React 和 Redux 从自定义组件更新应用程序状态

  15. 15

    无法使用Tomcat或GlassFish服务器从Java Jersey应用获取JSON响应

  16. 16

    Laravel 5.4 应用程序无法在自定义目录中加载自定义类

  17. 17

    coreFlightSystem 的自定义应用程序:“无法加载 cFE 应用程序”

  18. 18

    无法使用Jersey Webservice

  19. 19

    无法使用Jersey解析RESTful应用程序中的日期

  20. 20

    无法使用Jersey解析RESTful应用程序中的日期

  21. 21

    杰克逊通过字段名称自定义序列化程序?

  22. 22

    自定义杰克逊解组行为

  23. 23

    杰克逊自定义号码解析

  24. 24

    从杰克逊获取未知字段的列表

  25. 25

    杰克逊无法解析List <Long>

  26. 26

    杰克逊无法解析List <Long>

  27. 27

    杰克逊无法识别物业

  28. 28

    如何在任务窗格应用程序中使用OfficeJ获取/读取自定义文档属性?

  29. 29

    为什么我的NodeJS应用程序中的自定义MongoDB _id无法使用字符串uuid?

热门标签

归档