无法让球衣 2 应用程序使用自定义杰克逊 XmlMapper

2023-12-10

我正在使用 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);
        }
    }
    }
}

和 XMLMapper 提供者

    @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);
        }
    }
    }
}

它们都在同一个包中,并在应用程序资源类中注册

@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 from it

<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 as a XmlMapper类型,不ObjectMapper。正如所见here,提供者寻找ContextResolver for XmlMapper, not ObjectMapper.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法让球衣 2 应用程序使用自定义杰克逊 XmlMapper 的相关文章

  • 当同级滚动到达末尾时打开底部工作表吗?

    有没有办法将滚动事件从一个滚动视图 转发 到我的底部工作表 以便当我过度滚动第一个滚动视图时我的底部工作表开始展开 考虑这个小应用程序 public class MainActivity extends AppCompatActivity
  • 展开字符串中的环境变量

    是否有一些 java 实用程序 可以扩展 和 env 字符串中的变量 就像 bin MY PATH gt home john bin dev null 谢谢 基本上 您想要使用环境变量进行字符串插值并扩展主目录 我不知道执行后者的简单方法
  • 模拟匿名函数

    我正在编写 jUnits 但被 Lambda 表达式困住了 有没有办法模拟匿名函数 return retryTemplate execute retryContext gt return mockedResponse 在上面的代码中 我试图
  • CompletableFuture:几个任务

    如何使用 5 个 CompletableFutures 异步执行 20 个 Runnable 任务 或 1 个任务 20 次 这就是我所拥有的 Runnable task gt long startTime System currentTi
  • Spring Boot - 在部署时启动后台线程的最佳方式

    我在 Tomcat 8 中部署了一个 Spring Boot 应用程序 当应用程序启动时 我想在后台启动一个工作线程 Spring Autowires 具有一些依赖项 目前我有这个 SpringBootApplication EnableA
  • 如何在 ListViewer 中选择一个元素

    我正在尝试查找并选择一个元素ListViewer 我将字符串与中的每个元素进行比较ListViewer 我可以获得元素的索引 但我不知道如何在Listviewer String pattern elementText gettext Str
  • Google 语音 API 凭据

    我正在尝试使用 Google Speech API 但从 Google Cloud 外部进行一些测试 在旧的测试版中 我能够指定凭据文件 但现在我无法在SpeechClient class 如何使用 Google Speech API Ja
  • Java / Scala Future 由回调驱动

    简洁版本 我怎样才能创建一个Promise
  • PHP Socket Java 消息交换

    我正在尝试在 PHP 页面和正在运行的 Java 服务器之间进行通信 只是通过套接字进行简单的字符串交换 这是我处理连接的线程的 Java 代码 InputStream in clientSocket getInputStream Buff
  • gradlew:appengineEnhance 失败

    我正在使用 Java 创建移动后端Google App Engine with Android Studio 为了启动公开我的 API 的本地服务器 我使用gradlew module name appengineRun 然而 当我去htt
  • 如何解决找不到 com.google.cloud.Service 的类文件

    我正在尝试将 JSON 数据上传到 gcs 由于我之前没有使用谷歌云 所以我开始将随机字符串上传到 gcs 但在创建存储服务对象时我陷入了困境 Maven 依赖
  • 空手道弹簧整合

    我们有一个 Spring MVC 应用程序 是否可以在 Karate 中集成 spring 上下文 假设通过 Karate runner 绑定 SpringJunitRunner 或者通过 spring 上下文查找 bean 在空手道中一切
  • IBM Websphere JPA 配置 - 如何更新 persistence.xml

    我是 EJB 3 和 JPA 的新手 我在应用程序服务器中创建了一个数据源 它是jdbc AppDataSource 默认持久性提供程序保留为com ibm websphere persistence PersistenceProvider
  • 配置 Restlet 以在 Google App Engine 上返回 JSP?

    我开发了一个 Restlet 应用程序 我想通过 Restlet 返回一个 URL 请求的 JSP 文件 在不使用重定向的情况下如何实现此目的 IE 假设我在 mydomain com 上有文件 contact jsp 并且我希望人们能够访
  • JSF中直接更改URL来限制用户访问页面

    我的应用程序中有两种用户 客户和卖家 我正在使用一个PhaseListener在JSF中防止用户在未登录的情况下访问页面 但在登录后我不知道如何防止用户更改地址栏中的URL并访问他也不允许的页面 例如 阻止客户访问卖家页面 有谁知道我如何防
  • 如何让按钮打开

    我有一个问题 当用户单击 发送 按钮时 我需要将电子邮件发送到我的按钮 我只想到达那里 当用户单击发送按钮时 该按钮已经知道我的电子邮件地址并自动将其发送到那里的电子邮件 到目前为止 我的电子邮件活动 java import android
  • 亚马逊 AWS Java API。我看不到我的 AMI

    我正在使用 Amazon AWS 的 Java API 我成功进行了身份验证 然后获取了所有图像 但我的图像不在其中 我的 AMI 是私有的 但我想自从我经过身份验证后我仍然会看到它们 这是我的来源 final AmazonEC2 clie
  • Java Swing:为什么必须调整框架大小,以便可以显示已添加的组件

    我有一个简单的 Swing GUI 不仅如此 我编写的所有 swing GUI 运行它时 除了空白屏幕之外 它不会显示任何内容 直到我调整主框架的大小 因此每个组件都已重新绘制 我可以显示它们 这是我的简单代码 public static
  • 如何在 Android Lollipop 中使用注释修复 Android Jackson 解析期间的 IncompleteClassChangeError?

    在我们的 Android 应用程序中 我们在模型中使用 Jackson Annotations JsonTypeInfo use JsonTypeInfo Id NAME include JsonTypeInfo As PROPERTY p
  • OkHttp如何获取Json字符串?

    Solution 这是我这边的一个错误 正确的方法是响应 body string 以外响应 body toString 我使用 Jetty servlet URL 是http 172 16 10 126 8789 test path jso

随机推荐

  • python 将 pandas 数据帧、参数和函数传递给 scipy.optimize.minimize

    我正在尝试使用 SciPy 的 scipy optimize minimize 函数来最小化我创建的函数 然而 我试图优化的函数本身是由其他函数构建的 这些函数基于 pandas DataFrame 执行计算 据我所知 SciPy 的最小化
  • 编译 C++ 代码时出现 ios::nocreate 错误

    同时 在 RHEL 5 0 上编译一个用 C 编写的包 我收到以下错误 gt 错误 nocreate不是以下成员std ios 源代码对应于 ifstream tempStr argv 4 ios in ios nocreate 我努力了
  • 停止应用程序洞察

    我们为 Azure 门户中托管的 Web 应用程序安装了 Application Insights 现在它发送报告等 应用程序刚刚启动 我们不需要所有这些数据 有没有办法完全停止 禁用 Application Insights 的所有数据收
  • Node js 在复制之前检查文件是否打开

    在将文件复制到另一个位置之前 我需要检查文件是否已打开 下面的代码告诉您打开文件时是否显示错误代码 EBUSY 但如果文件未打开 它将删除文件的内容 有没有更好的方法来获取这些信息 fs open my file dwg w functio
  • 如何估计 R 中图形线上的点的坐标?

    假设我有数据 x lt c 1900 1930 1944 1950 1970 1980 1983 1984 y lt c 100 300 500 1500 2500 3500 4330 6703 然后 我绘制这些数据并在已知的 x 和 y
  • Ivy 无法解析依赖关系的范围,该依赖关系是传递依赖关系的依赖关系

    我向 ivy xml 添加一个依赖项 让我们将其命名为 A 该文件在 Maven 中心有一个 pom 文件 Ivy 使用 ibiblio 来解决 Maven 依赖关系 添加到ivy xml 的依赖项 A 具有传递依赖项 B 到目前为止一切顺
  • $_Session 登录和注销 php 的“复杂性”

    我正在为大学做一个数据库项目 我在这里遇到了一个问题 我试图在没有会话时显示 登录 在有会话时显示 注销 但实际上即使在我登录后它仍然显示我 登录 并且我尝试 print r SESSION 它告诉我该变量未定义 我有一个注销文件 和一个
  • PHP 发送 UTF-8 邮件而不使用 PEAR::Mail PEAR::Mail_Mime

    我希望能够使用包含 8 位字符 的 PHP mail 发送电子邮件 它们将用在主题 消息和 发件人 标题中 在不使用 PEAR 包的情况下如何做到这一点 如果您不介意对不需要的单词进行编码 最简单的解决方案是将所有内容放入 base64 R
  • 上传文件之前生成 Firebase 存储下载 url

    Firebase Storage 有没有办法生成一个指向任何内容的下载网址 以便稍后将文件上传到该网址 类似的东西 在 Kotlin 中 fun generateItemPhotoUrl id String storageRef child
  • 调用链内的空合并

    如果我有一长串对象 每个对象都有可能在 Linq where 子句中返回 null 例如 SomeSource Where srcItem gt srcItem DataMembers SomeText Connection Connect
  • Realm 返回空对象列表

    我想从 Farmer 对象中获取 CropDataList 当我获取 Farmer 对象时 它不为空 但与 Farmer 对象关联的作物数据列表返回空 我可以通过 Stetho 查看数据库条目 并且列表中有一个条目 这是我的代码 publi
  • 使用 LINQ(赛程列表)形成锦标赛表

    I have an array of players string and now I need to get an array of pairs representing games playerN playerM to orginize
  • httr POST 请求 API 返回 400 错误

    我正在使用 R 中的 httr 包来尝试查询 postcode io API http postcodes io docs 我可以按照说明成功查询单个邮政编码 sample4 lt GET api postcodes io postcode
  • Bull队列:当作业失败时,如何停止队列处理剩余作业?

    我在用bull队列来处理一些作业 在当前场景中 每个作业都是某种操作 因此 每当队列中的操作列表中的操作 作业 失败时 队列就必须停止处理剩余的作业 操作 到目前为止我尝试过什么 所以我尝试在特定作业失败时暂停队列 接下来 队列在耗尽时恢复
  • Glassfish v4 和 SSL - 管理员不再起作用

    我已经完成了将 SSL 证书添加到 glassfish v4 中的步骤 我已经验证它可以通过浏览器和我的 java swing 客户端工作 我在客户端使用 apache 的 http 客户端库 不起作用的是管理控制台 成功导入 SSL 后
  • 如何在角度2中使用jquery?

    我知道我是否需要在 Angular 1 3 或 1 4 中使用第三方库 我需要对该东西进行指令并在我们的项目中使用它 现在我正在使用角度2 0 我想把这个做成angular 2 https jqueryui com autocomplete
  • minSdkVersion破解程序

    所以每当我添加
  • 使用 for 循环将输入分成两部分

    这就是我在尝试使用网络课程学习 Python 时陷入困境的地方 编写一个程序 采用 number1 number2 形式的单个输入行 其中两者都表示正整数 并输出两个数字的总和 例如 输入 5 12 时输出应为 17 我们不应该使用 spl
  • 使用 JSoup 从 Google 搜索结果的所有页面检索所有链接

    我有以下使用 JSoup 在 java 中解析 HTML 的代码 Document linksDoc null linksDoc Jsoup connect http www google com search q jbutton user
  • 无法让球衣 2 应用程序使用自定义杰克逊 XmlMapper

    我正在使用 Jersey 2 22 1 和 Jackson 2 6 3 编写 Web 应用程序 我的 pom xml 如下所示