2016-04-12 4 views
0

Я пытаюсь опубликовать FileInputStream с помощью Дооснащаемого 1.9.x (я не могу перейти на 2.0.x еще)проводка FileInputStream с Retrofit 1.9.x

Я прочитал This Post.

В этом сообщении я понял, что если я использую TypedInput в своем интерфейсе и реализую оболочку класса TypedInput, которая обрабатывает поток, тогда он должен работать. Непонятно, был ли TypedInput vs TypedOutput ответом (TypedInput выглядел наиболее корректно, связанная документация по дооснащению не указывала, насколько я мог это сказать. Также все перемещено в 2.0)

Чтобы продолжить - я создал класс

private class InputStreamMunger implements TypedInput { 
    private InputStream is; 
    private String mimeType; 
    private Long fileLength; 

    public InputStreamMunger(InputStream is, String mimeType, Long fileLength) { 
     this.is = is; 
     this.fileLength = fileLength; 
     this.mimeType = mimeType; 
    } 

    @Override 
    public String mimeType() { 
     return mimeType; 
    } 

    @Override 
    public long length() { 
     return fileLength; 
    } 

    @Override 
    public InputStream in() throws IOException { 
     return is; 
    } 
} 

Мой Интерфейс:

@Multipart 
@POST("/MrService/v1/upload/{accountId}") 
Response upload(
    @Path("accountId") String accountId, 
    @Part("file") TypedInput file); 

Тогда я называю это

FileInputStream is = new FileInputStream("src/test/java/com/me/MrService/tester.txt"); 
    InputStreamMunger file ; 

    try { 
     file = new InputStreamMunger(is, "text/plain", is.getChannel().size()); 
    } catch (IOException e) { 
     e.printStackTrace(); 
     return; 
    } 

    Response r = client.upload("12345", file); 

Ошибки я получаю:

retrofit.RetrofitError: com.fasterxml.jackson.databind.JsonMappingException: No serializer found for class com.me.MrService.IntegrationTestIT$InputStreamMunger and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS)) 

Означает ли это, что мне нужно, чтобы создать свой собственный картографа для обработки Потока? Я надеюсь, что я просто делаю что-то неправильно и что мне не нужно прыгать через этот обруч.

Спасибо!

ответ

0

В конце я реализовал TypedOutput вместо TypedInput.

private class InputStreamMunger implements TypedOutput { 

    private InputStream is; 
    private String mimeType; 
    private Long fileLength; 
    private String fileName; 
    private static final int BUFFER_SIZE = 4096; 


    public InputStreamMunger(InputStream is, String mimeType, Long fileLength, 
      String fileName) { 
     this.is = is; 
     this.fileLength = fileLength; 
     this.mimeType = mimeType; 
     this.fileName = fileName; 
    } 

    @Override 
    public String mimeType() { 
     return mimeType; 
    } 

    @Override 
    public long length() { 
     return fileLength; 
    } 

    @Override 
    public void writeTo(OutputStream out) throws IOException { 
     byte[] buffer = new byte[BUFFER_SIZE]; 
     try { 
      int read; 
      while ((read = is.read(buffer)) != -1) { 
       out.write(buffer, 0, read); 
      } 
     } finally { 
      is.close(); 
     } 
    } 

    public String fileName() { 
     return fileName; 
    } 

} 
Смежные вопросы