JAXB/Jersey - 如何指定“schemaLocation”

2023-11-29

我正在使用 Jersey 创建一个宁静的 Web 服务编组 XML。

如何设置 xsi:schemaLocation?

This answer展示如何直接在 Marshaller 上设置 Marshaller.JAXB_SCHEMA_LOCATION。

我遇到的麻烦是 Jersey 正在将 Java 对象封送到 XML 中。我如何告诉 Jersey 架构位置是什么?


你可以创建一个MessageBodyWriter对于这个用例。通过ContextResolver机制你可以获得JAXBContext与您的域模型相关联。然后你可以获得一个Marshaller来自JAXBContext并设置JAXB_SCHEMA_LOCATION就可以了,做元帅。

package org.example;

import java.io.*;
import java.lang.annotation.Annotation;
import java.lang.reflect.*;

import javax.ws.rs.*;
import javax.ws.rs.core.*;
import javax.ws.rs.ext.*;
import javax.xml.bind.*;

@Provider
@Produces(MediaType.APPLICATION_XML)
public class FormattingWriter implements MessageBodyWriter<Object>{

    @Context
    protected Providers providers;

    public boolean isWriteable(Class<?> type, Type genericType,
        Annotation[] annotations, MediaType mediaType) {
        return true;
    }

    public void writeTo(Object object, Class<?> type, Type genericType,
        Annotation[] annotations, MediaType mediaType,
        MultivaluedMap<String, Object> httpHeaders,
        OutputStream entityStream) throws IOException,
        WebApplicationException {
        try {
            ContextResolver<JAXBContext> resolver 
                = providers.getContextResolver(JAXBContext.class, mediaType);
            JAXBContext jaxbContext;
            if(null == resolver || null == (jaxbContext = resolver.getContext(type))) {
                jaxbContext = JAXBContext.newInstance(type);
            }
            Marshaller m = jaxbContext.createMarshaller();
            m.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, "foo bar");
            m.marshal(object, entityStream);
        } catch(JAXBException jaxbException) {
            throw new WebApplicationException(jaxbException);
        }
    }

    public long getSize(Object t, Class<?> type, Type genericType,
        Annotation[] annotations, MediaType mediaType) {
        return -1;
    }

}

UPDATE

还有一个问题。我的休息资源和提供者之间有什么联系?

您仍然以相同的方式实施您的资源。这MessageBodyWriter机制只是一种覆盖 XML 写入方式的方法。这@Provider注释是 JAX-RS 应用程序自动注册此类的信号。

我的资源类将返回Foo目的。我认为我应该实施MessageBodyWriter<Foo>?

你可以将其实现为MessageBodyWriter<Foo>如果您只想将其应用于Foo班级。如果您希望它不仅仅适用于Foo你可以实施isWriteable方法为适当的类返回 true。

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

JAXB/Jersey - 如何指定“schemaLocation” 的相关文章

随机推荐

  • 使用函数参数进行回文条件检查[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 这是使用函数参数来检查字符串是否回文的 php 代码
  • Java 日期之间的天数(作业)

    当我运行该程序时 这是几天的休息时间 对我做错了什么有什么建议吗 我知道有一种更简单的方法可以做到这一点 但为此我试图展示查找之间的天数的所有实际步骤 家庭作业 因此不能使用日期时间库 public class DaysBetween pu
  • Spring REST 模拟上下文路径

    我尝试使用以下代码片段设置 Spring Rest 模拟的上下文路径 private MockMvc mockMvc Before public void setUp this mockMvc MockMvcBuilders webAppC
  • 重复条目并重命名 pandas 数据透视表中的列行而不进行聚合

    我正在尝试将这个示例数据帧从长格式重塑为宽格式 而不聚合任何数据 import numpy as np import pandas as pd df pd DataFrame SubjectID A A A B B C A Date 201
  • ssh远程主机标识已更改[关闭]

    Closed 这个问题是与编程或软件开发无关 目前不接受答案 我已经重新安装了服务器 并且收到以下消息 user hostname ssh root pong WARNING REMOTE HOST IDENTIFICATION HAS C
  • Libsodium“调用未定义的函数sodium_randombytes_buf”[关闭]

    Closed 这个问题需要调试细节 目前不接受答案 尝试遵循示例here 但它给了我 Fatal error Uncaught Error Call to undefined function sodium randombytes buf
  • 如何更改 adobe reader 缩放级别?

    我有一个 Jasper Report 它在 Java Spring 中创建 PDF 我已经尝试改变缩放级别几个小时但没有成功 每当我使用 Adob e reader 打开 pdf 时 其分辨率为 149 同事甚至更糟 曾经有一个类似的que
  • 为什么可以将匿名类的实例分配给接口变量?

    我是 Java 新手 我无法理解之间的关系anonymous class instance and interface 请参阅中的示例这个网站 anonymous instance as a variable Runnable r new
  • 读取和写入文件的最简单方法

    有很多不同的方式来读取和写入文件 文本文件 不是二进制 在 C 中 我只需要简单且使用最少代码的东西 因为我将在项目中大量使用文件 我只需要一些东西string因为我需要的只是阅读和写作strings Use 文件 ReadAllText
  • 我是否需要在
    标记等末尾添加“/”? [复制]

    这个问题在这里已经有答案了 你需要有一个 在一个结束时img标签 我看见一个例子在 W3schools com 上没有 img src smiley gif alt Smiley face height 42 width 42 我知道没有必
  • 提取方法中的空验证

    我使用 c 8 和可空分析器 csproj
  • Shiny flexdashboard 中的facet_grid 给出错误“分面变量必须至少有一个值”

    我在获取 ggplot2 时遇到一些问题facet grid评估系统的绘图 该图渲染良好 但我在浏览器和控制台中收到以下错误 错误 分面变量必须至少有一个值 每次我根据输入切换品牌条目时都会发生这种情况input brand 应用程序不会崩
  • OpenCV:findContours 函数错误

    我正在使用 2 4 3 版本的 opencv 并尝试在精明的边缘检测后使用 findContours 函数 如下所示 struct Component cv Rect boundingBox double area double circu
  • Yii2 从后端控制器调用 api 方法

    我已经按照 Yii Rest API 文档基于高级模板实现了 API 我想从后端控制器调用 API 方法 可以做吗 Thanks 所以 我终于找到了解决办法 我的 Yii2 应用程序有高级模板 我已经创建了 api 模块 所以应用程序有 3
  • 复制到 CUDA 常量内存时设备符号无效

    我有几个图像处理应用程序的文件 由于在执行某些图像处理算法时图像的行数和列数不会改变 因此我试图将这些值放入常量内存中 我的应用程序看起来像 图像处理程序 constant int c rows constant int c cols if
  • 单击按钮时触发 BroadcastReceiver

    当我单击 main xml 上的按钮时 我试图接收 BroadcastReceiver mainfest xml
  • AutoCompleteTextView 不响应对其 ArrayAdapter 的更改

    The ArrayList似乎填充得很好 但无论我使用什么方法 我似乎都无法让适配器填充数据 我尝试添加到ArrayList 也到ArrayAdapter 无论哪种方式 我都无法在AutoCompleteTextView水平 或在Array
  • 如何读取Apache Derby数据库日志?

    我想看一下 Derby 的数据库日志 我不是指 derby log 文件 我指的是 derby log 文件中的二进制日志文件 database name log目录 有没有一种工具可以以人类可读的格式显示它们 我询问的原因是我正在使用 A
  • 验证仅允许在 Android 中编辑文本中使用数字和字符

    在我的应用程序中 我必须验证EditText 它应该只允许字符 数字 下划线和连字符 这是我的代码 edittext addTextChangedListener new TextWatcher Override public void o
  • JAXB/Jersey - 如何指定“schemaLocation”

    我正在使用 Jersey 创建一个宁静的 Web 服务编组 XML 如何设置 xsi schemaLocation This answer展示如何直接在 Marshaller 上设置 Marshaller JAXB SCHEMA LOCAT