JSF Seam @RequestParameter Файл / Изображение - PullRequest
2 голосов
/ 19 мая 2011

У меня есть Backing Bean, в котором я читаю параметр, который не привязан к компоненту. Шов предложил прочитать параметр get. Я использовал

@RequestParameter private String param1;

таким образом, он не пропускает мой метод действия при ошибке проверки, например, когда я использовал

Потому что я не хочу отображать HTML-ответы, а использовать бизнес-логику повторно. Вместо этого я беру поток ответов и сам пишу обработанный ответ
FacesContext ctx = FacesContext.getCurrentInstance();

final HttpServletResponse resp = (HttpServletResponse)ctx.getExternalContext().getResponse();      
resp.getOutputStream().write(xml.getBytes());
resp.getOutputStream().flush();
resp.getOutputStream().close();

ctx.responseComplete(); // render response phase done

Я пытался прочитать файл из inputStream HttpServletRequest, но он уже был пустым. Есть ли способ получить «файл» из JSF? Я мог бы использовать отдельный сервлет и обработать его там, но это немного нарушило бы то, как я строил остальную часть интерфейса.

Спасибо за любой совет.

Редактировать: просто для полноты кода для входного потока

final HttpServletRequest request = (HttpServletRequest)ctx.getExternalContext().getRequest();
ServletInputStream stream = request.getInputStream();
int byt = stream.read(); // byt was -1

Редактировать Редактировать: Извините за длинный пост. Теперь я сделал отдельный сервлет. Там я также получаю пустой входной поток, хотя Firefug сказал, что я передал файл. Как это может быть пустым?

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

boolean isMultipart = ServletFileUpload.isMultipartContent(req);
ServletInputStream stream= req.getInputStream();
int test = stream.read(); // test == -1

Этот код сервлета прекрасно работает в отдельном проекте, поэтому один из сервлетов JSF / Seam в цепочке фильтров должен удалить данные. Если у кого-то есть подсказка, какую или как проверить.

1 Ответ

2 голосов
/ 20 мая 2011

SeamFilter или точнее MultipartFilter проверял каждый запрос, является ли он запросом POST и составным.Если это так, они обернули запрос в MultipartRequest и поместили файлы в отдельную карту параметров.

final HttpServletRequestWrapper request = (HttpServletRequestWrapper)FacesContext.getCurrentInstance().getExternalContext().getRequest();
final ServletRequest innerRequest = request.getRequest();
if(innerRequest instanceof MultipartRequest){
    byte[] imageData = ((MultipartRequest)innerRequest).getFileBytes("image");
...