2012-06-28 2 views
0

У меня возникла проблема с попыткой вставить экземпляр solr-сервера из компонента в мой код. Я получаю NullPointerException и проверил сам экземпляр сервера и проверил, что он равен нулю. Я могу создать сервер, не введя его просто отлично.Не удается ввести Solr Server в приложение, используя Spring через @Autowired

Мой файл spring.xml объявляет боб, как это:

<bean id="solrServer" class="org.apache.solr.client.solrj.impl.HttpSolrServer">` 
    <constructor-arg index="0" value="${solr.serverUrl}" /> 
</bean> 

<context:annotation-config /> 
<context:component-scan base-package="my.base.package" /> 

где значение ${solr.serverUrl} было подтверждено, чтобы быть правильным.

Файл web.xml имеет Слушатель контекста в нем:

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>classpath:spring.xml</param-value> 
</context-param> 

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

<servlet> 
    . 
    <servlet-class> 
     com.sun.jersey.spi.spring.container.servlet.SpringServlet 
    </servlet-class> 
    . 
</servlet> 

код, который я пытаюсь внедрить этот компонент является время @Autowired в следующим образом:

34 @Component 
35 public class GenericClassImpl implements GenericClass{ 
36 
37  @Autowired 
38  private SolrServer solrServer; 
39 
40  public String doQuery(String query){ 
41   try{   
42     SolrQuery solrQuery = new SolrQuery(query);   
43     QueryResponse rsp = solrServer.query(solrQuery); 
44     SolrDocumentList docs = rsp.getResults(); 
45   
46     return docs.toString(); 
47   }catch(Exception e){ 
48    e.printStackTrace(); 
49   } 
50  } 
51 } 

Я попытался использовать @Qualifier("solrServer") вместе с @Autowired, и это тоже не сработало.

Это все делается с использованием maven, который, похоже, не имеет проблем. Выход я получаю

java.lang.NullPointerException 
    at ...GenericClassImpl.doQuery(GenericClassImpl.java:43) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.java:60) 
    at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$TypeOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:185) 
    at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75) 
    at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:288) 
    at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147) 
    at com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108) 
    at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147) 
    at com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84) 
    at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1483) 
    at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1414) 
    at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1363) 
    at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1353) 
    at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:414) 
    at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:537) 
    at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:708) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) 
    at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:877) 
    at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:594) 
    at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1675) 
    at java.lang.Thread.run(Thread.java:662) 

Опять же, если я

SolrServer solrServer = new HttpSolrServer(serverUrl); 

код работает просто отлично, и я могу выполнять запросы на сервере Solr. Любые идеи относительно того, что я делаю неправильно, что это не будет вводить?

код, который получает экземпляр GenericClassImpl является

public class GenericServiceImpl implements GenericService{ 

    protected GenericClass gc; 

    @GET 
    @Path({pathParam}) 
    public String doGet(@PathParam({pathParam}) String pathParam, 
         @DefaultValue("*:*") @QueryParam("q") String query){ 

      gc = SearchFactory.getInstance().getGenericClass(pathParam);   
      return gc.doQuery(query); 
     } 
    } 

И SearchFactory является

public class SearchFactory{ 

    private static SearchFactory instance; 

    private SearchFactory(){} 

    public static SearchFactory getInstance() { 
     if (instance == null) 
      instance = new SearchFactory(); 
     return instance; 
    } 

    public GenericClass getGenericClass(String type){ 

     GenericClass result = null; 

     if(type.toLowerCase().equals("case1")){ 
      result = new GenericClassImpl1(); 
      return result; 
     } 
     else if(type.toLowerCase().equals("case2")){ 
      result = new GenericClassImpl2(); 
      return result; 
     } 
     else throw new Exception(); 
    } 
} 

И GenericClassImpl1 и GenericClassImpl2 продлить GenericClassImpl и в настоящее время пуст.

+0

Не могли бы вы показать нам код, в котором вы получаете экземпляр GenericClassImpl? –

+0

Я только что добавил в код, который получает экземпляр. Благодаря! – James

ответ

0

Для работы @Autowired для работы вам необходимо получить свои GenericClassImpl экземпляры с весны. Если вы этого не сделаете, Spring не будет авторизовать зависимости.

Вы не можете создать экземпляр с помощью ключевого слова new и использовать методы инъекции зависимостей.

Что вы можете сделать, это сохранить статическую ссылку на ваш ApplicationContext, а затем вытащить экземпляры соответствующего компонента из них в ваш метод getGenericClass.

Это на самом деле хороший пример использования шаблона ServiceLocator, как описано в документации Spring.

+0

То, что я закончил делать, и это прекрасно работало, бросало компонент в классы SearchFactory, GenericClassImpl1 и GenericClassImpl2 и использовал Autowired для новых переменных экземпляра внутри них и просто возвращал эти частные переменные, позволяя пружине справляться с их конструкцией и иметь возможность управлять их жизненный цикл – James

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

  • Нет связанных вопросов^_^