Определить тип ответа RESTEasy во время выполнения

#response #resteasy

#ответ #resteasy

Вопрос:

Веб-сервис, который мне нужно вызвать, возвращает «два разных объекта ответа» во время выполнения без каких-либо заголовков или метаданных, чтобы их различать.

Единственный способ — это чтение и преобразование входного потока на стороне клиента. Мне интересно, как это возможно с помощью rest easy?

Ответ №1:

Мы должны определить средство чтения тела сообщения, и там мы можем решить, какой объект передавать. Это пример кода:

 ResteasyProviderFactory restProviderFactory = ResteasyProviderFactory.getInstance();
RegisterBuiltin.register(restProviderFactory);
restProviderFactory.addMessageBodyReader(MyRestResponseReader.class);

HttpClient httpClient = new HttpClient(new MultiThreadedHttpConnectionManager());
ClientExecutor executor = new ApacheHttpClientExecutor(httpClient);
MyRestInterface client = ProxyFactory.create(MyRestInterface.class, url, executor);

ClientResponse<Object> res =  client.get(request);
Object output = res.getEntity();


public class MyRestResponseReader implements MessageBodyReader<Object> {
    public boolean isReadable(Class clazz, Type type, Annotation[] annptation, MediaType mediaType) {
            return  Object.class.isAssignableFrom(clazz);
        }

public Object readFrom(Class clazz, Type type, Annotation[] annotation, MediaType mediaType, MultivaluedMap map, InputStream inputStream)
        throws IOException, WebApplicationException {
        try{
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            String allLines = "";
            String line = "";
            while( (line = bufferedReader.readLine()) != null){
                allLines = allLines   line;
            }

            if(allLines.contains("...")){
                JAXBContext jaxbContext = JAXBContext.newInstance(MyResponseA.class);
                Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
                StringReader reader = new StringReader(allLines);
                return (MyResponseA) unmarshaller.unmarshal(reader);                
            }else if (allLines.contains("validationResponse")){
                JAXBContext jaxbContext = JAXBContext.newInstance(MyResponseB.class);
                Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
                StringReader reader = new StringReader(allLines);
                return (MyResponseB) unmarshaller.unmarshal(reader);                
            }
        }catch(Exception e){
        }
        return null;
    }
}

public interface MyRestInterface {

    @POST
    @Consumes({"application/xml"})
    @Produces({"application/xml"})
    public ClientResponse<Object> get(ValidationRequest req);

}