मैं स्प्रिंग रेस्ट के साथ फाइलों की एक सूची भेजने की कोशिश कर रहा हूं लेकिन मुझे यह अपवाद मिलता है।स्प्रिंग रेस्ट - फाइलों की सूची भेजते समय अपवाद
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);
}
}
[इसे देखें] (http: // stackoverflow।कॉम/प्रश्न/25103070/resttemplate-httpmessagenotwritableexception-no-serializer-for-class-ja) – Onkar
धन्यवाद। मैंने यह पोस्ट देखा है। मेरा कोड काफी समान है। – Clemzd
तो आपका प्रश्न स्प्रिंग रेस्ट टेम्पलेट के बारे में नहीं बल्कि वसंत सुरक्षा के बारे में है? यदि आप गंतव्य सर्वर पर सुरक्षा का समर्थन करना चाहते हैं तो आपका अनुरोध प्रमाणित होना चाहिए (शीर्षक शीर्ष सेट करना: 'प्रमाणीकरण: मूल QWxhZGRpbjpPcGVuU2VzYW1l' –