Rest Easy,如何在post方法中接受XML / JSON请求作为源文档对象

时间:2015-04-14 08:20:00

标签: xml json rest jax-rs resteasy

我想要做的是,如果客户端在帖子中发送JSON或XML,它应该呈现为源文档参数吗?

@POST
Response doPost(Source source){
}

任何想法。我试着看MessageBodyReader/Writer一些拦截方法,但似乎没有任何效果,我相信3.0.10 Resteasy不再支持MessageBodyReader

1 个答案:

答案 0 :(得分:0)

默认情况下,JAXB提供程序支持XML。这意味着您需要Source类的JAXB注释,并遵循适用于JAXB注释/映射的任何其他规则

@XmlRootElement
public class Source {
    ....
}
  

“我相信3.0.10 Resteasy不再支持MessageBodyReader。”

实际上这是一个必须支持的JAX-RS类/接口/提供程序,。通常使用杰克逊提供商,MessageBodyReaderMessageBodyWriter

如果您使用的是Maven,则只需添加此依赖项

即可
<dependency>
    <groupId>org.jboss.resteasy</groupId>
    <artifactId>resteasy-jackson2-provider</artifactId>
    <version>3.0.10.Final</version>
</dependency>

并且提供者应该自动注册。

如果您没有使用Maven,请获取所有这些罐子

enter image description here

它们都应该包含在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"}