2016-10-10 1 views
1

В документах Джерси приведен пример how to inject HttpSession on resources. Как я должен вводить (или иначе получать доступ к) параметры формы, отправленные по запросам с помощью «Content-Type: application/x-www-form-urlencoded»? Я вижу, что они переданы как parameters on methods, and do not seem to be annotated, позволяя мне поверить, что здесь есть какая-то причуда?Поставщик инъекций с инъецированным MultivaluedMap (application/x-www-form-urlencoded)

The (наивный) завод Я сейчас работаю с реализуются следующим образом, JerseyHttpServletRequestWrapper быть один из моих собственных классов:

import org.glassfish.hk2.api.Factory; 

import javax.inject.Inject; 
import javax.servlet.http.HttpServletRequest; 
import javax.ws.rs.core.MultivaluedMap; 

public class JerseyHttpServletRequestWrapperFactory implements Factory<JerseyHttpServletRequestWrapper> { 
    private final HttpServletRequest request; 
    private final MultivaluedMap<String, String> formParams; 

    @Inject 
    public JerseyHttpServletRequestWrapperFactory(HttpServletRequest request, MultivaluedMap<String, String> formParams) { 
     this.request = request; 
     this.formParams = formParams; 
    } 

    @Override 
    public JerseyHttpServletRequestWrapper provide() { 
     return new JerseyHttpServletRequestWrapper(request, formParams); 
    } 

    @Override 
    public void dispose(JerseyHttpServletRequestWrapper jerseyHttpServletRequestWrapper) { 
    } 
} 

Я думаю здесь, что поставщик предприятия должно быть введен в экземпляр так что я могу проверить, есть ли на самом деле объект, отправленный с запросом. Попытка непосредственно вводить ошибки MultivaluedMap с:

org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at SystemInjecteeImpl(requiredType=MultivaluedMap<String,String>,parent=JerseyHttpServletRequestWrapperFactory,qualifiers={},position=1,optional=false,self=false,unqualified=null,2067821943) 
+0

Это не тот вопрос, который вы должны задать на SO. Вы должны показать нам, что вы сделали до сих пор - дайте нам код. –

ответ

2

Когда вы

@POST 
public Response post(MultivaluedMap<String, String> params) {} 

этот метод впрыска параметр обрабатывается иначе, чем с обычным впрыском поле/конструктора. Поэтому вы не можете попытаться ввести MultivaluedMap в поле.

Что вы можете сделать, хотя вводите ContainerRequest, а затем читаете тело. Вы захотите проверить, что это POST-запрос, а Content-Type - application/x-www-form-urlencoded. Если вы этого не сделаете, есть шанс, что вы получите исключение при попытке прочитать объект.

@Inject 
ContainerRequest request; 

if (request.getMethod().toUpperCase().equals("POST") 
    && request.getMediaType().equals(MediaType.APPLICATION_FORM_URLENCODED_TYPE)) { 
    request.bufferEntity(); 
    Form form = request.readEntity(Form.class); 
    MultivaluedMap<String, String> params = form.asMap(); 
} 
Смежные вопросы