java - 如何将我的注册提供者与动态创建的 Jersey 资源类一起使用?

标签 java jersey jax-rs

我只是想知道我们如何将我们注册的提供者(MessageBodyReader 和 MessageBodyWriter)与动态创建的 jersey 资源类一起使用,即通过编程 jersey 资源 api 以编程方式创建的 jersey 资源,例如

 Resource.Builder resourceBuilder = Resource.builder();
        resourceBuilder.path("helloworld/{name}");

        ResourceMethod.Builder methodBuilder = resourceBuilder.addMethod("POST");
        methodBuilder.produces(MediaType.TEXT_PLAIN_TYPE).consumes(MediaType.TEXT_PLAIN_TYPE)
                .handledBy(new MyInflector());
         Resource resource = resourceBuilder.build();
        registerResources(resource);

现在如何在MyInflector类中使用我注册的MessageBodyReader和Writer如下

public class MyInflector implements Inflector<ContainerRequestContext, String>{

    @Override
    public String apply(ContainerRequestContext arg0) {
        System.out.println("Processing request");
         MultivaluedMap<String, String> pParams =arg0.getUriInfo().getPathParameters();
         InputStream stream=arg0.getEntityStream();
         if (stream != null) {
                Writer writer = new StringWriter();

                char[] buffer = new char[5120];
                try {
                    Reader reader = new BufferedReader(
                            new InputStreamReader(stream, "UTF-8"));
                    int n;
                    while ((n = reader.read(buffer)) != -1) {
                        writer.write(buffer, 0, n);
                    }
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } finally {
                    try {
                        stream.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
                return writer.toString();
            } else {
                return "";
            }
    }

}

最佳答案

您可以做的是将 ContainerRequestContext 转换为 ContainerRequest(这是 ContainerRequestContext 接口(interface)的 Jersey 实现。有了这个类,您可以调用 containerRequest.readEntity(Pojo.class)。这将导致调用 Pojo.class 类的读取器(假设内容类型也与媒体匹配输入端点消耗)。

@Override
public String apply(ContainerRequestContext requestContext) {
    ContainerRequest containerRequest = (ContainerRequest)requestContext;
    Model model = containerRequest.readEntity(Model.class);
    ...
}

关于java - 如何将我的注册提供者与动态创建的 Jersey 资源类一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54594595/

相关文章:

java - Groovy 打印 Map<String,List<Map<String,String>>> 数据

java - 安卓工作室错误 : cannot resolve symbol in Xml

java - 任何人都可以在 tomcat localhost 日志中指出此错误的原因吗?

java - 使用 Jersey 添加新资源

java - jpa 和 java bean 外键验证

authentication - 在Jersey Jax-rs Web服务上启用OAuth1支持

java - 如何使用java在SQL中查找两个时间值的差异?

jersey - 如何在 Spring 中将 Swagger 与 Jersey 一起使用?

java - 没有可用于接口(interface)列表和 MIME 媒体类型 application/json with UTF-8 的阅读器

java - RESTlet + JAX-RS 身份验证中间件