Я использую метод restTemplate.exchange или restTemplate.postForObject на стороне клиента, где я передаю запрос с заголовками и методом аутентификации.
На стороне сервера с другой системой выдает ошибку как
Caused by: javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,1]
Message: Content is not allowed in prolog.
at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.next(XMLStreamReaderImpl.java:604) ~[?:1.8.0_171]
at org.glassfish.jersey.jaxb.internal.AbstractCollectionJaxbProvider.readFrom(AbstractCollectionJaxbProvider.java:344) ~[jersey-media-jaxb-2.24.1.jar:?]
Таким образом выбрасывая ошибку как
ERROR com.....ExceptionHandler - Exception occurred while processing the request! javax.ws.rs.BadRequestException: HTTP 400 Bad Request
Что здесь не так?
Я попытался отправить минимальные параметры только обязательные, попытался обмен () и метод postForObject ().
XML-запрос, сгенерированный из этого httpEntity ниже, прекрасно работает в почтальоне
вот мой класс обслуживания -
@Service("Service")
public class Service {
private static final Logger logger = LogManager.getLogger(Service.class);
@Autowired
private RestTemplate restTemplate;
@SuppressWarnings("rawtypes")
public String postRequest(String loanId, Request requestXml, Map<String, String> headersInfo) {
HttpHeaders headers = new HttpHeaders();
// ResponseEntity<GenericResponse<Response>> response = null;
Response response = null;
// String response = null;
List<String> riskReductionIdList = null;
String riskReductionId = null;
String responseString = null;
headers.setContentType(MediaType.APPLICATION_XML);
headers.set("-External-System-ID", headersInfo.get("ExternalSystemId"));
headers.set("-External-User-ID", headersInfo.get("ExternalUserId"));
String plainCredentials=headersInfo.get("User") + ":" + headersInfo.get("Password");
String base64Credentials = new String(Base64.encodeBase64(plainCredentials.getBytes()));
byte[] encodedAuth = Base64.encodeBase64(
plainCredentials.getBytes(Charset.forName("US-ASCII")) );
headers.add("Authorization", "Basic " + base64Credentials);
headers.setAccept(Collections.singletonList(MediaType.APPLICATION_XML));
StringWriter request = new StringWriter();
try {
JAXBContext jaxbContext = JAXBContext.newInstance(Request.class);
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,true);
marshaller.marshal(requestXml, request);
logger.error(" request : " + request.toString());
} catch (JAXBException e1) {
logger.error("Exception happened in coverting the request for logging",e1);
}
HttpEntity<?> httpEntity = new HttpEntity<Object>(requestXml, headers);
logger.error(" Request Body: " + httpEntity.getBody());
logger.error(" Request headers: " + httpEntity.getHeaders());
try{
// response = restTemplate.exchange(url, HttpMethod.POST, httpEntity, new ParameterizedTypeReference<GenericResponse<Response>>() {} );
response = restTemplate.postForObject(url, httpEntity, Response.class);
}catch(HttpClientErrorException ex){
logger.error(" Error while sending data to for loan id : " + loanId + "\n Error : "+ ex.getMessage());
logger.error(" responseBody : " + ex.getResponseBodyAsString() + "\n statusText : "+ ex.getStatusText() + "\n statusCode : "+ ex.getStatusCode());
}catch(HttpServerErrorException ex){
logger.error(" Error while sending data to for loan id : " + loanId + "\n Error : "+ ex.getMessage());
logger.error(" responseBody : " + ex.getResponseBodyAsString() + "\n statusText : "+ ex.getStatusText() + "\n statusCode : "+ ex.getStatusCode());
}catch(Exception ex){
logger.error(" Error while sending data to for loan id : " + loanId + "\n Error : "+ ex.getMessage());
}
responseString = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?> <response> <code>0</code> <status>SUCCESS</status> <messages/> <payload> "
+ " <riskReductionIds> <riskReductionId>10000</riskReductionId> </riskReductionIds> </payload> </response>";
return riskReductionId;
}
}