2016-11-25 5 views
11

मैं स्प्रिंग रेस्ट के साथ फाइलों की एक सूची भेजने की कोशिश कर रहा हूं लेकिन मुझे यह अपवाद मिलता है।स्प्रिंग रेस्ट - फाइलों की सूची भेजते समय अपवाद

Could not write content: No serializer found for class java.io.ByteArrayInputStream

यह एक फ़ाइल (ByteArrayResource) के साथ काम करता है।

यह फ़ाइलों की सूची (List<ByteArrayResource>) के साथ काम नहीं करता है।

  • एक सरणी भेजने एक सूची
  • सूची लपेट के बजाय:

    List<ByteArrayResource> contentsAsResource = new ArrayList<ByteArrayResource>(); 
    for(MultipartFile fichier : fichiers) { 
        contentsAsResource.add(new ByteArrayResource(fichier.getBytes()) { 
         @Override 
         public String getFilename() 
         { 
          return fichier.getOriginalFilename(); 
         } 
        }); 
    }; 
    map.add("files", contentsAsResource); 
    HttpHeaders headers = new HttpHeaders(); 
    headers.setContentType(MediaType.MULTIPART_FORM_DATA); 
    HttpEntity<LinkedMultiValueMap<String, Object>> requestEntity = new HttpEntity<LinkedMultiValueMap<String, Object>>(map, headers); 
    
    FormHttpMessageConverter formConverter = new FormHttpMessageConverter(); 
    formConverter.setMultipartCharset(Charset.forName("UTF8")); 
    formConverter.addPartConverter(new MappingJackson2HttpMessageConverter()); 
    
    this.restClientHelper.getRestTemplate().getMessageConverters().add(formConverter); 
    this.restClientHelper.getRestTemplate().postForObject("file/save", requestEntity, Object.class); 
    

    मैं जिसके बाद काम नहीं किया की कोशिश की है:

    यहाँ मेरी कोड के महत्वपूर्ण भागों है एक dto

  • बाइट्स भेजें [] लेकिन यह तब काम नहीं करता है जब फ़ाइल> 1.5 एमबी

मैं deserialization डीबगिंग कर रहा है लेकिन यह समझने के लिए एक दर्द है!

यदि यह मदद कर सकता है, तो एक फ़ाइल के साथ कनवर्टर 'ResourceHttpMessageConverter' का उपयोग किया जाता है।

किसी को भी कोई विचार है?

संपादित करें: अगर मैं प्रत्येक फ़ाइल को मानचित्र में फ़ाइल (सूची के बजाय) में जोड़ता हूं तो अनुरोध काम करता है।

for (MultipartFile fichier : fichiers) { 
    map.add("files", new ByteArrayResource(fichier.getBytes()) { 
    @Override 
    public String getFilename() 
    { 
     return fichier.getOriginalFilename(); 
    } 
    }); 
}; 

लेकिन मुझे एक और अपवाद मिलता है: org.springframework.web.client.ResourceAccessException: I/O error on POST request for "http://localhost:8080/myApp/ws/file/save"। गंतव्य सर्वर पर एक मूल प्रमाणीकरण सक्षम है। अगर मैंने इसे अक्षम कर दिया, तो सबकुछ काम कर रहा है! गंतव्य सर्वर पर वसंत-सुरक्षा कॉन्फ़िगरेशन यहां है।

<http pattern="/ws/file/**" authentication-manager-ref="basicAuthenticationManager" create-session="stateless"> 
     <intercept-url pattern="/**" access="isAuthenticated()"/> 
     <http-basic /> 

     <csrf disabled="true" /> 
     <headers disabled="true" /> 
</http> 

क्या मुझे वसंत सुरक्षा कॉन्फ़िगरेशन में कुछ याद आ रही है?

संपादित करें 2: ऐसा लगता है वहाँ टोकन "प्राधिकरण" हेडर में नहीं है, यह मैन्युअल रूप से समस्या

संपादित 3 ठीक जोड़ने: समस्या हल! वसंत शेष टेम्पलेट के साथ बहुउद्देशीय फ़ाइलों को मूल ऑथ सक्षम के साथ गंतव्य सर्वर पर भेजते समय, मूलभूत प्रमाणीकरण टोकन जोड़ने के लिए इसकी आवश्यकता होती है। यह यहां अच्छी तरह से समझाया गया है: Basic authentication for REST API using spring restTemplate। मुझे नहीं पता कि यह एक बग है या नहीं (वसंत से)। इस अद्यतन से पहले मेरे विन्यास (मैं इंटरसेप्टर रास्ता चुना है) यह था:

this.restTemplate.getInterceptors().add(new BasicAuthorizationInterceptor(username, password)); 

वर्ग है:

private static class BasicAuthorizationInterceptor implements ClientHttpRequestInterceptor 
{ 

    private final String username; 

    private final String password; 

    public BasicAuthorizationInterceptor(String username, String password) 
    { 
    this.username = username; 
    this.password = (password == null ? "" : password); 
    } 

    @Override 
    public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException 
    { 
    byte[] token = Base64.getEncoder().encode((this.username + ":" + this.password).getBytes()); 
    request.getHeaders().add("Authorization", "Basic " + new String(token)); 
    return execution.execute(request, body); 
    } 

    } 
+0

[इसे देखें] (http: // stackoverflow।कॉम/प्रश्न/25103070/resttemplate-httpmessagenotwritableexception-no-serializer-for-class-ja) – Onkar

+0

धन्यवाद। मैंने यह पोस्ट देखा है। मेरा कोड काफी समान है। – Clemzd

+0

तो आपका प्रश्न स्प्रिंग रेस्ट टेम्पलेट के बारे में नहीं बल्कि वसंत सुरक्षा के बारे में है? यदि आप गंतव्य सर्वर पर सुरक्षा का समर्थन करना चाहते हैं तो आपका अनुरोध प्रमाणित होना चाहिए (शीर्षक शीर्ष सेट करना: 'प्रमाणीकरण: मूल QWxhZGRpbjpPcGVuU2VzYW1l' –

उत्तर

0
वसंत सुरक्षा विन्यास में

final BasicCredentialsProvider credentialsProvider = new BasicCredentialsProvider(); 
credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(login, motDePasse)); 
httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider); 
... 
final HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(); 
requestFactory.setHttpClient(httpClientBuilder.build()); 
this.restTemplate = new RestTemplate(requestFactory); 

मैं इस जोड़ दिया है फाइल प्रमाणीकरण प्रदाता गायब है। आप इसके बजाय इंटरसेप्टर

<authentication-manager> 
    <authentication-provider> 
     <user-service> 
     <user name="user" password="password" /> 
     </user-service> 
    </authentication-provider> 
</authentication-manager> 
संबंधित मुद्दे