我想要做的是,如果客户端在帖子中发送JSON或XML,它应该呈现为源文档参数吗?
@POST
Response doPost(Source source){
}
任何想法。我试着看MessageBodyReader/Writer
一些拦截方法,但似乎没有任何效果,我相信3.0.10 Resteasy不再支持MessageBodyReader
。
答案 0 :(得分:0)
默认情况下,JAXB提供程序支持XML。这意味着您需要Source
类的JAXB注释,并遵循适用于JAXB注释/映射的任何其他规则
@XmlRootElement
public class Source {
....
}
“我相信3.0.10 Resteasy不再支持MessageBodyReader。”
实际上这是一个必须支持的JAX-RS类/接口/提供程序,是。通常使用杰克逊提供商,MessageBodyReader
和MessageBodyWriter
。
如果您使用的是Maven,则只需添加此依赖项
即可<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jackson2-provider</artifactId>
<version>3.0.10.Final</version>
</dependency>
并且提供者应该自动注册。
如果您没有使用Maven,请获取所有这些罐子
它们都应该包含在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();
}
}
App Config
@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"}