JAXB/Jersey-如何指定;schemaLocation“;

JAXB/Jersey-如何指定;schemaLocation“;,jaxb,jersey,Jaxb,Jersey,我正在使用Jersey创建一个restful web服务来封送XML 如何设置xsi:schemaLocation 这将演示如何直接在封送器上设置Marshaller.JAXB_SCHEMA_位置 我遇到的问题是Jersey正在将Java对象编组为XML。如何告诉Jersey模式位置是什么?您可以为此用例创建一个MessageBodyWriter。通过ContextResolver机制,您可以获得与域模型关联的JAXBContext。然后,您可以从JAXBContext获取Marshaller,

我正在使用Jersey创建一个restful web服务来封送XML

如何设置xsi:schemaLocation

这将演示如何直接在封送器上设置Marshaller.JAXB_SCHEMA_位置


我遇到的问题是Jersey正在将Java对象编组为XML。如何告诉Jersey模式位置是什么?

您可以为此用例创建一个
MessageBodyWriter
。通过
ContextResolver
机制,您可以获得与域模型关联的
JAXBContext
。然后,您可以从
JAXBContext
获取
Marshaller
,并在其上设置
JAXB\u SCHEMA\u位置
,然后执行封送

package org.example;
导入java.io.*;
导入java.lang.annotation.annotation;
导入java.lang.reflect.*;
导入javax.ws.rs.*;
导入javax.ws.rs.core.*;
导入javax.ws.rs.ext.*;
导入javax.xml.bind.*;
@提供者
@生成(MediaType.APPLICATION\u XML)
公共类FormattingWriter实现MessageBodyWriter{
@上下文
受保护的提供者;
公共布尔值可写(类类型、类型genericType、,
注释[]注释,MediaType(MediaType){
返回true;
}
public void writeTo(对象、类类型、类型genericType、,
注释[]注释,MediaType MediaType,
多值MAP HttpHeader,
OutputStream entityStream)引发IOException,
WebApplicationException{
试一试{
上下文解析器
=providers.getContextResolver(JAXBContext.class,mediaType);
JAXBContext JAXBContext;
if(null==resolver | | null==(jaxbContext=resolver.getContext(type))){
jaxbContext=jaxbContext.newInstance(类型);
}
Marshaller m=jaxbContext.createMarshaller();
m、 setProperty(Marshaller.JAXB_SCHEMA_位置,“foo-bar”);
m、 封送处理(对象,entityStream);
}捕获(JAXBEException JAXBEException){
抛出新的WebApplicationException(JAXBEException);
}
}
公共长getSize(对象t、类类型、类型genericType、,
注释[]注释,MediaType(MediaType){
返回-1;
}
}

更新

还有一个问题。我的rest资源和提供者之间的连接是什么

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

我的资源类将返回一个
Foo
对象。我想我应该实施一个
MessageBodyWriter

如果只希望将其应用于
Foo
类,则可以将其实现为
MessageBodyWriter
。如果您希望它不仅仅应用于
Foo
,您可以实现
isWriteable
方法,为相应的类返回true