Я хотел бы обернуть 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.
Я не вижу, что не так. Можете ли вы указать мне, как должна быть выполнена эта конфигурация?
я получаю исключение, потому что нет UriInfo. Я хочу, чтобы этот объект был запрошен. UriInfo не мой класс, а что-то доступное для веб-приложений. –
Вы вводите QueryFactory в класс SpringConfiguration. Этот класс конфигурации init начинается в начале вашего приложения, и он не является частью веб-запроса. – reos