2013-09-18 2 views
5

Я использую Jersey + Spring. У меня есть фильтр Джерси, который реализует ContainerRequestFilter, и мне нужно передать объект в ресурс jersey.Как я могу добавить параметр для запроса от запроса фильтра Джерси (ContainerRequestFilter)

Например:

@Provider 

public class UnmarshalEntityFilter implements ContainerRequestFilter { 

private static final Logger LOGGER = LoggerFactory.getLogger(UnmarshalEntityFilter.class); 

@Override 
public ContainerRequest filter(ContainerRequest containerRequest) { 

    final String xml = getRequestBody(containerRequest); 
    // Parse this xml to Object 

    // How I can add this Object to my request and get from Jersey Resource ? 

    return containerRequest; 
} 

private String getRequestBody(ContainerRequest request) { 

    ByteArrayOutputStream out = new ByteArrayOutputStream(); 
    InputStream in = request.getEntityInputStream(); 
    StringBuilder sb = new StringBuilder(); 
    try { 
     if (in.available() > 0) { 
      ReaderWriter.writeTo(in, out); 

      byte[] requestEntity = out.toByteArray(); 
      sb.append(new String(requestEntity, "UTF-8")); 
     } 

     return sb.toString(); 
    } catch (IOException ex) { 
     throw new ContainerException(ex); 
    } 

} 

}

ответ

3

увидеть ContainerRequest#setProperty(String, Object) метод, который гласит

В Servlet контейнер, свойства синхронизированы с ServletRequest и выставить все атрибуты доступны в ServletRequest. Любые изменения свойств также отражаются в наборе свойств связанного ServletRequest.

Таким образом, вы можете просто позвонить

final String xml = getRequestBody(containerRequest); 
containerRequest.setProperty("xml", xml); 

затем впрыснуть HttpServletRequest в обработчике и доступ к нему с HttpServletRequest#getAttribute("xml").

С Джерси 1.17, соответствующий метод ContainerRequest#getProperties() который возвращает изменяемый Map<String, Object>, к которому вы можете поместить атрибуты, которые будут синхронизироваться с ServletRequest.

Вы можете получить собственность в вашем Джерси ресурс от HttpContext:

@Context 
private HttpContext httpCtx 
... 
final String xml = httpCtx.getProperties().get("xml") 

На другой ноте, бережного потребляющего запрос InputStream. Если какой-либо другой компонент в вашем стеке также должен читать из потока, он будет терпеть неудачу.

+0

В моем контейнереRequest у меня нет этого метода (setProperty) ... – Malahov

+0

@Malahov В какую версию вы используете? –

+0

1.17.1 Malahov

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