URLDecoder: недопустимые шестнадцатеричные символы в шаблоне escape (%) для составных данных

Я использую multipart для получения данных PDF и объекта из службы. Я получаю следующую ошибку

java.lang.IllegalArgumentException: URLDecoder: недопустимые шестнадцатеричные символы в шаблоне escape (%) — для входной строки: «PD» в java.net.URLDecoder.decode(URLDecoder.java:205) в org.springframework.http.converter.FormHttpMessageConverter .read(FormHttpMessageConverter.java:186)

при вызове службы.

SERVICE :


@RequestMapping(value = "/getPDF", method = RequestMethod.GET,produces = MediaType.MULTIPART_FORM_DATA_VALUE)
	public ResponseEntity<MultiValueMap<String, Object>> getPDF(
			@RequestParam String key,
			HttpServletResponse response)  {
		

	
		MultiValueMap<String, Object> pdfResultMap = new LinkedMultiValueMap<String, Object>();
		
		
		//Get the result 
		ByteArrayResource byteArrayResource = getPdf(); //Assign the PDF
		
		
		//1) Build the first byte[] result
/*	    LinkedMultiValueMap<String, String> pdfMap = new LinkedMultiValueMap<>();
	    pdfMap.add("Content-disposition", "attachment;" );
	    pdfMap.add("Content-type", "application/pdf");*/
		  HttpHeaders xHeader2 = new HttpHeaders();
		    xHeader2.setContentType(MediaType.APPLICATION_PDF);
	    HttpEntity<ByteArrayResource> doc = new HttpEntity<ByteArrayResource>(byteArrayResource, xHeader2);
	    pdfResultMap.add("doc", doc);
	    
        // 2) Build the next 
	    //Header
	    HttpHeaders xHeader = new HttpHeaders();
	    xHeader.setContentType(MediaType.APPLICATION_JSON);
	    
	   // Get the result
	    Map<String, String> stringMap = new HashMap<String, String>();
	   //populate String map
	    
	    HttpEntity<Map<String, String>> stringMapObject = new HttpEntity<Map<String, String>>(stringMap, xHeader);
	    pdfResultMap.add("stringMap", stringMapObject);
	    
	    //3) Build the simple header 
	    
	    HttpHeaders xHeader1 = new HttpHeaders();
	    xHeader.setContentType(MediaType.APPLICATION_JSON);
	    HttpEntity<String> titlePart = new HttpEntity<String>("pdftitle", xHeader1);
	    pdfResultMap.add("title", titlePart);
	    
		ResponseEntity<MultiValueMap<String, Object>> responseEntity = new ResponseEntity<MultiValueMap<String, Object>>(pdfResultMap, HttpStatus.OK);

		return responseEntity;
	}
	
	
	CLIENT :
	
	public getPdf() {
	
	FormHttpMessageConverter formConverter = new FormHttpMessageConverter() {
		    @Override
		    public boolean canRead(Class<?> clazz, MediaType mediaType) {
		        if (clazz == MultiValueMap.class) {
		            return true;
		        }
		        return super.canRead(clazz, mediaType);
		    }
		};
		
		
		formConverter.setCharset(Charset.forName("UTF-8"));
	    List<HttpMessageConverter<?>> partConverters = new ArrayList<HttpMessageConverter<?>>();
	    partConverters.add(new ByteArrayHttpMessageConverter());
	    StringHttpMessageConverter stringHttpMessageConverter = new StringHttpMessageConverter(Charset.forName("UTF-8"));
	    stringHttpMessageConverter.setWriteAcceptCharset(false);
	    partConverters.add(stringHttpMessageConverter);
	    partConverters.add(new ResourceHttpMessageConverter());   
	    formConverter.setPartConverters(partConverters);
	
	
	   restTemplate.getMessageConverters().add(formConverter); 
	   
	   ResponseEntity<MultiValueMap> response =  restTemplate.exchange(builder.build().encode().toUri(), HttpMethod.GET,entity, MultiValueMap.class);
	   
	   
	   }
	   
	   
I  Tried adding :
    	   

    	   	List<MediaType> a = new ArrayList<MediaType>();
    		a.add(MediaType.APPLICATION_OCTET_STREAM);
    		a.add(MediaType.MULTIPART_FORM_DATA);
    		a.add(new MediaType("application","pdf"));
    formConverter.setSupportedMediaTypes(a);  

But the same error .

Что-нибудь, что мне здесь не хватает?


person stackuser    schedule 16.11.2018    source источник


Ответы (1)


Вы пытаетесь читать из FormHttpMessageConverter, но документ https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/http/converter/FormHttpMessageConverter.html говорит

«Другими словами, этот преобразователь может читать и записывать медиа-тип «application/x-www-form-urlencoded» как MultiValueMap, а также может записывать (но не читать) «multipart/form- data" тип мультимедиа как MultiValueMap."

person Maksim    schedule 16.11.2018
comment
Спасибо Максим. Я не знал этого. Есть ли другой способ отправить поток байтов и объект клиенту из службы? кроме преобразования в базу 64? - person stackuser; 16.11.2018
comment
Я думаю, что нет никакого способа избежать использования пакета org.springframework.web.multipart. - person Maksim; 16.11.2018
comment
Спасибо Максим. Есть ли пример для этого? - person stackuser; 16.11.2018
comment
Спасибо Максим. Похоже, даже это поддерживает загрузку файлов, а не загрузку файла и объекта вместе. Я рассмотрю base64 - person stackuser; 16.11.2018