默认情况下,JAXB 提供程序支持 XML。这意味着您需要 Source 类的 JAXB 注释,并遵循适用于 JAXB 注释/映射的任何其他规则
@XmlRootElement
public class Source {
....
}
“我相信 3.0.10 Resteasy 不再支持 MessageBodyReader。”
实际上这是一个必须支持的 JAX-RS 类/接口/提供程序,是。通常使用 Jackson 提供程序,MessageBodyReader 和 MessageBodyWriter。
如果你使用的是 Maven,你可以简单地添加这个依赖
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jackson2-provider</artifactId>
<version>3.0.10.Final</version>
</dependency>
并且提供者应该会自动注册。
如果您不使用 Maven,请获取所有这些 jars
它们都应该包含在Resteasy distribution 中(尽管链接没有显示 3.0.10 下载 - 不确定从哪里获得)
更新
因此,随着 OP 的进一步澄清,要求是能够使用javax.xml.transform.stream.StreamSource。
您可以编写自定义MessageBodyReader,并在那里创建StreamSource 并返回它。例如
MessageBodyReader
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import javax.ws.rs.Consumes;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.ext.MessageBodyReader;
import javax.ws.rs.ext.Provider;
import javax.xml.transform.stream.StreamSource;
@Provider
@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public class StreamSourceMessageBodyReader implements MessageBodyReader<StreamSource> {
@Override
public boolean isReadable(Class<?> type, Type t, Annotation[] antns, MediaType mt) {
return type.isAssignableFrom(StreamSource.class);
}
@Override
public StreamSource readFrom(Class<StreamSource> type, Type type1,
Annotation[] antns, MediaType mt, MultivaluedMap<String, String> mm,
InputStream in) throws IOException, WebApplicationException {
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
return new StreamSource(reader);
}
}
资源
@Path("source")
public class SourceResource {
@POST
@Consumes({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public Response postSource(StreamSource source) throws Exception {
StringBuilder builder = new StringBuilder("Response=");
try (BufferedReader reader = (BufferedReader) source.getReader()) {
String line = null;
while ((line = reader.readLine()) != null) {
builder.append(line).append("\n");
}
}
return Response.ok(builder.toString()).build();
}
}
应用配置
@ApplicationPath("/api")
public class RestApplication extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> classes = new HashSet<>();
classes.add(SimpleResource.class);
classes.add(SourceResource.class);
return classes;
}
@Override
public Set<Object> getSingletons() {
Set<Object> singletons = new HashSet<>();
singletons.add(new StreamSourceMessageBodyReader());
return singletons;
}
}
测试
$ curl -X POST -H "Content-Type:application/json"
-d '{"hello":"world"}' http://localhost:8080/api/source
结果:
Response={"hello":"world"}