Код на стороне клиента для составной операции REST - PullRequest
0 голосов
/ 15 марта 2019

Привет! Мне нужно использовать операцию REST, которая принимает полезную нагрузку xml и файл pdf.В основном объект JAXB преобразуется в строку XML и загружается в файл XML.Таким образом, в составном запросе загружаются xml-файл и pdf-файл.

Код стороны сервера операций REST выглядит следующим образом:

сторона сервера:

public class CompanyType extends MediaType {

public final static final XML_STRING = "applicaiton/company+xml";

}

@POST
@Path("/upload")
@Consumes("multipart/mixed")
@Produces(CompanyType.XML_STRING)
public UploadResponseObject upload(MultiPart multiPart){

UploadRequestObject req = multiPart.getBodyParts().get(0).getEntityAs(UploadRequestObject.class);
            BodyPartEntity bpe = (BodyPartEntity) multiPart.getBodyParts().get(1).getEntity();
            byte[] pdfBytes = IOUtils.toByteArray(bpe.getInputStream());
....
....
}

код на стороне клиента для использования операции REST:

@Autowired
private RestTemplate rt;

public UploadResponseObject callMultipartUploadOperation(UploadRequestObject req, java.io.File target) throws Exception {
        String url = "http://<host-name>:<port>/service-name/upload");

        MultiValueMap<String, Object> mv = new LinkedMultiValueMap<String, Object>();

        this.rt = new RestTemplate();
        this.rt.setMessageConverters(getMessageConverter());
        String id = <random number generated from 1 to 50000>;

        // Add xml entity
        org.springframework.http.HttpHeaders xmlFileHeaders = new org.springframework.http.HttpHeaders();
        xmlFileHeaders.add(MeditType.CONTENT_TYPE, "applicaiton/company+xml");
        HttpEntity<String> xmlFile = new HttpEntity<String>(createXMLString(req), xmlFileHeaders);
        mv.add(id + ".xml", xmlFile);

        // Add pdf file     

        org.springframework.http.HttpHeaders fileHeaders = new org.springframework.http.HttpHeaders();
        fileHeaders.add(MediaType.CONTENT_TYPE, "application/pdf");
        FileSystemResource fsr = new FileSystemResource(target);
        HttpEntity<FileSystemResource> fileEntity = new HttpEntity<FileSystemResource>(
                fsr, fileHeaders);
        String filename = target.getName();
        mv.add(filename, fileEntity);

        HttpEntity<UploadRequestObject> ereq = new HttpEntity<UploadRequestObject>(req, getRequestHeaders());
        ResponseEntity<UploadResponseObject> res= this.restTemplate.postForEntity(url, ereq, UploadResponseObject.class);       
        return res.getBody();
    }

private List<HttpMessageConverter<?>> getMessageConverter() {
        List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();
        Jaxb2Marshaller jaxb2Marshaller = new Jaxb2Marshaller();
        jaxb2Marshaller.setClassesToBeBound(UploadResponseObject.class);
        MarshallingHttpMessageConverter mhmc = new MarshallingHttpMessageConverter(jaxb2Marshaller);
        List<org.springframework.http.MediaType> supportedMediaTypes = new ArrayList<org.springframework.http.MediaType>();
        supportedMediaTypes.add(new org.springframework.http.MediaType("application", "company+xml"));
        mhmc.setSupportedMediaTypes(supportedMediaTypes);
        messageConverters.add(mhmc);

        // Add Form and Part converters
        FormHttpMessageConverter fmc = new FormHttpMessageConverter();
        fmc.addPartConverter(new Jaxb2RootElementHttpMessageConverter());
        messageConverters.add(fmc);

        return messageConverters;
    }

Когда строка ниже выполняется из кода клиента,

ResponseEntity<UploadResponseObject> res= this.rt.postForEntity(url, ereq, UploadResponseObject.class); 

следующее исключение

org.springframework.web.client.RestClientException: Could not write request: no suitable HttpMessageConverter 
found for request 
type [org..types.UploadRequestObject] 
and content type [application/company+xml]

Пожалуйста, сообщите изменения, чтобы заставить код на стороне клиента работать.

1 Ответ

0 голосов
/ 22 марта 2019

После долгих проб и ошибок смог найти решение для того же.

Код клиента:

@Autowired
    private RestTemplate rt;

public UploadResponseObject callMultipartUploadOperation(UploadRequestObject req, java.io.File target) throws Exception {
        String url = "http://<host-name>:<port>/service-name/upload");

        MultiValueMap<String, Object> mv = new LinkedMultiValueMap<String, Object>();

        this.rt = new RestTemplate();
        this.rt.setMessageConverters(getMessageConverter());
        String id = <random number generated from 1 to 50000>;

        // Add xml entity
        org.springframework.http.HttpHeaders xmlFileHeaders = new org.springframework.http.HttpHeaders();
        xmlFileHeaders.add(MeditType.CONTENT_TYPE, "applicaiton/company+xml");
        HttpEntity<String> xmlFile = new HttpEntity<String>(createXMLString(req), xmlFileHeaders);
        mv.add(id + ".xml", xmlFile);

        // Add pdf file     

        org.springframework.http.HttpHeaders fileHeaders = new org.springframework.http.HttpHeaders();
        fileHeaders.add(MediaType.CONTENT_TYPE, "application/pdf");
        FileSystemResource fsr = new FileSystemResource(target);
        HttpEntity<FileSystemResource> fileEntity = new HttpEntity<FileSystemResource>(
                fsr, fileHeaders);
        String filename = target.getName();
        mv.add(filename, fileEntity);

        HttpEntity<UploadRequestObject> ereq = new HttpEntity<UploadRequestObject>(req, getRequestHeaders());
        ResponseEntity<UploadResponseObject> res= this.restTemplate.postForEntity(url, ereq, UploadResponseObject.class);       
        return res.getBody();
    }

Преобразователи сообщений:

private List<HttpMessageConverter<?>> getMessageConverter() {
            List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();
            Jaxb2Marshaller jaxb2Marshaller = new Jaxb2Marshaller();
            jaxb2Marshaller.setClassesToBeBound(UploadResponseObject.class);
            MarshallingHttpMessageConverter mhmc = new MarshallingHttpMessageConverter(jaxb2Marshaller);
            List<org.springframework.http.MediaType> supportedMediaTypes = new ArrayList<org.springframework.http.MediaType>();
            supportedMediaTypes.add(new org.springframework.http.MediaType("application", "company+xml"));
            supportedMediaTypes.add(new org.springframework.http.MediaType("multipart", "form-data"));
            mhmc.setSupportedMediaTypes(supportedMediaTypes);
            messageConverters.add(mhmc);

            // Add Form and Part converters
            FormHttpMessageConverter fmc = new FormHttpMessageConverter();
            fmc.addPartConverter(new Jaxb2RootElementHttpMessageConverter());
            fmc.addPartConverter(new ResourceHttpMessageConverter());
            messageConverters.add(fmc);

            return messageConverters;
        }

Заголовки запроса:

private org.springframework.http.HttpHeaders getRequestHeaders(String contentType) throws Exception {
            ....
            .....
            org.springframework.http.HttpHeaders httpHeaders = new org.springframework.http.HttpHeaders();
            httpHeaders.set("Accept", "applicaiton/company+xml");
            httpHeaders.set("Content-Type", "multipart/form-data");
            String consumer = "<AppUserId>";
            httpHeaders.set("consumer", consumer);
            String tmStamp= getCurrentTimeStamp();
            httpHeaders.set("timestamp", tmStamp);
            ...
            ...
            return httpHeaders;
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...