Передача файлов и данных с Джерси - PullRequest
1 голос
/ 15 марта 2012

Я пытаюсь разработать некоторые службы отдыха с Джерси для загрузки и скачивания файлов (что-то вроде файлового менеджера). Если мои сервисы производят / используют только класс File в качестве «application / octet-stream», как в приведенном ниже коде, они работают.

@GET
@Produces("application/octet-stream")
public File getFile(String id) {
    try {
        File file = new File(System.getProperty("user.home"), id);
        return file;
    } catch (FileNotFoundException ex) {
        Logger.getLogger(GenericResource.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IOException ex) {
        Logger.getLogger(GenericResource.class.getName()).log(Level.SEVERE, null, ex);
    }
    return null;
}

Но если я пытаюсь передать пользовательский объект, который содержит поле File и некоторые другие данные (FileEnvelope в образце), я получаю сообщение об ошибке.

@GET
@Produces("application/octet-stream")
public FileEnvelope getXml(String id) {
    try {
        File file = new File(System.getProperty("user.home"), id);
        FileEnvelope fileEnvelope = new FileEnvelope(file, "text");
        return fileEnvelope;
    } catch (FileNotFoundException ex) {
        Logger.getLogger(GenericResource.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IOException ex) {
        Logger.getLogger(GenericResource.class.getName()).log(Level.SEVERE, null, ex);
    }
    return null;
}

Ошибка

Вызывается: com.sun.jersey.api.MessageException: средство записи тела сообщения для класса Java com.mycompany.restdemo.FileEnvelope и класса Java-типа com.mycompany.restdemo.FileEnvelope и типа мультимедиа application / octet поток не был найден

Где я не прав? Это правильный способ справиться с этим делом? Мой клиент не мог быть "клиентом Джерси".

Ответы [ 2 ]

1 голос
/ 15 марта 2012

Джерси не знает, как сериализовать ваш доменный объект в поток октетов, если вы не скажете, как это сделать.В этом случае, если вы хотите включить дополнительную информацию помимо данных файла, вы должны подумать о том, как клиент должен ее прочитать.Вы можете:

  1. Вставить информацию непосредственно в поток октетов, создав собственный MessageBodyWriter .Клиенту необходимо знать, где искать эту информацию в результирующем файле.

  2. Включить информацию как часть заголовка ответа HTTP, используя ResponseBuilder .Клиенту просто нужно знать, какие заголовки ответов нужно проверить для получения информации.

0 голосов
/ 15 марта 2012

Вы можете отправлять различные типы данных в одном сообщении, используя multipart / * типы данных.Например, эта статья показывает, как: http://aruld.info/handling-multiparts-in-restful-applications-using-jersey/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...