Как использовать моих зарегистрированных провайдеров с динамически создаваемым классом ресурсов джерси? - PullRequest
0 голосов
/ 08 февраля 2019

Я просто хочу знать, как мы можем использовать наших зарегистрированных провайдеров (MessageBodyReader и MessageBodyWriter) с динамически создаваемым классом ресурсов джерси, т.е. ресурсом джерси, создаваемым программно с помощью API ресурсов программного джерси, таких как

 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);

Теперь, как использовать мои зарегистрированные MessageBodyReader и Writer в классе MyInflector, который выглядит следующим образом

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 "";
            }
    }

}

1 Ответ

0 голосов
/ 10 февраля 2019

То, что вы можете сделать, это привести ContainerRequestContext к ContainerRequest (который является реализацией интерфейса ContainerRequestContext на Джерси. С этим классом вы можете вызвать containerRequest.readEntity(Pojo.class). Это вызовет считыватель для Pojo.class вызываемый класс (при условии, что тип содержимого также совпадает с типом носителя, который использует конечная точка).

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