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