2015-12-16 2 views
0

Я хотел бы обернуть UriInfo в свой пользовательский объект запроса и сделать его доступным в других компонентах Spring. Я был в состоянии сделать это с HK2 как этотКак использовать область запроса весной?

package test.service; 

@Path("/test") 
public class TestResource { 

    @Inject 
    private Query query; 

    @GET 
    public String test() { 
     return "found: " + query.toString(); 
    } 
} 

с правильной фабрики

package test.utils; 

public class QueryFactory implements Factory<Query> { 

    @Inject 
    private UriInfo uriInfo; 

    @Override 
    public Query provide() { 
     Query query = new Query(); 
     Iterator<String> it = uriInfo.getQueryParameters().keySet().iterator(); 

     if(it.hasNext()) { 
      String key = it.next(); 
      List<String> valueList = uriInfo.getQueryParameters().get(key); 
      String value; 
      if(valueList.isEmpty()) 
       value = "no value"; 
      else 
       value = valueList.get(0); 

      query.setKey(key); 
      query.setValue(value); 
     } else { 
      query.setKey("no query"); 
     } 
     return query; 
    } 

    @Override 
    public void dispose(Query query) { 
    } 
} 

Теперь я хотел бы перейти к прыжку. Я попробовал, добавив конфигурацию

package test.config 

@Configuration 
@ComponentScan("test") 
public class SpringConfiguration { 

    @Autowired 
    QueryFactory queryFactory; 

    @Bean 
    public Query query() throws Exception { 
     return queryFactory.getObject(); 
    } 
} 

обновляя web.xml

<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

<listener> 
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> 
</listener> 

<context-param> 
    <param-name>contextClass</param-name> 
    <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value> 
</context-param> 

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>test.config.SpringConfiguration</param-value> 
</context-param> 

изменения TestResource

package test.service; 

@Path("/test") 
@Component 
public class TestResource { 

    @Autowired 
    private Query query; 

    @GET 
    public String test() { 
     return "found: " + query.toString(); 
    } 
} 

и добавление annotation к QueryFactory

@Component 
@Scope("request") 
public class QueryFactory implements FactoryBean<Query> 

Я понимаю, что RequestContextListener требуется для работы с запросом объема. Однако, когда я запускаю его я получаю исключение, которое говорит мне

`java.lang.IllegalStateException: No thread-bound request found:` 

Вы имеете в виду атрибуты запроса за пределами фактического веб-запроса, или обработки запроса за пределами первоначально получающего потока? Если вы на самом деле работает в веб-запроса и по-прежнему получать это сообщение, ваш код, вероятно, работает за пределами

DispatcherServlet/DispatcherPortlet:

В этом случае используйте RequestContextListener или RequestContextFilter выставить ток запрос.

Что смешно, так как я уже добавил RequestContextListener в web.xml.

Если я запускаю без установленного набора ContextLoaderListener, я получаю исключение NullPointerException в TestResource, потому что запрос равен null.

Я не вижу, что не так. Можете ли вы указать мне, как должна быть выполнена эта конфигурация?

ответ

0

Проблема заключается в том, что вы говорите, Весну, что QueryFactory имеет область запроса

@Component 
@Scope("request") 
public class QueryFactory 

Таким образом, этот объективистские существует только в середине веб-запроса. Но вы пытаетесь использовать его вне веб-запроса.

@Autowired 
QueryFactory queryFactory; 

Вы можете увидеть его в Exception

Вы со ссылкой на запрос атрибутов вне фактического веб запроса

+0

я получаю исключение, потому что нет UriInfo. Я хочу, чтобы этот объект был запрошен. UriInfo не мой класс, а что-то доступное для веб-приложений. –

+0

Вы вводите QueryFactory в класс SpringConfiguration. Этот класс конфигурации init начинается в начале вашего приложения, и он не является частью веб-запроса. – reos

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