2016-02-29 6 views
1

Я пытаюсь прочитать много первых имен из моей базы данных с помощью JDBC, и он отлично работает в моем сервлете под именем HelloServlet. Я действительно могу ответить на запрос GET с кучей имен.@Resource не инъецируется в управляемый бином CDI, но отлично работает в веб-сервлете

@WebServlet(name = "helloServlet", value = "/hello") 
public class HelloServlet extends HttpServlet { 
    @Resource(lookup = "java:global/employeesDS") 
    DataSource ds; 

    @Override 
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
     List<String> list = new ArrayList<>(); 

     try(Connection connection = ds.getConnection()) { 
      Statement statement = connection.createStatement(); 
      ResultSet result = statement.executeQuery("SELECT first_name FROM employees"); 

      while(result.next()) { 
       list.add(result.getString(1)); 
      } 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 

     PrintWriter pw = resp.getWriter(); 
     for(String name : list) { 
      pw.write(name + " "); 
     } 
    } 
} 

Когда я пытаюсь тот же код в КДИ управляемый компонент, то ds остается null, вызывая NullPointerException проблемы:

@Named("dataFetchBean") 
@RequestScoped 
public class DataFetchBean { 
    @Resource(lookup = "java:global/employeesDS") 
    DataSource ds; 
    List<String> questions; 

    public List<String> getQuestions() { 
     try(Connection connection = ds.getConnection()) { 
      Statement statement = connection.createStatement(); 
      ResultSet result = statement.executeQuery("SELECT first_name FROM employees"); 

      while(result.next()) { 
       questions.add(result.getString(1)); 
      } 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 

     return questions; 
    } 
} 

В случае это уместно, это мой файл web.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" 
     version="3.1"> 
    <data-source> 
     <name>java:global/employeesDS</name> 
     <class-name>com.mysql.jdbc.jdbc2.optional.MysqlDataSource</class-name> 
     <server-name>localhost</server-name> 
     <port-number>3306</port-number> 
     <database-name>employees</database-name> 
     <user>root</user> 
     <password /> 
    </data-source> 

    <servlet> 
     <servlet-name>Faces Servlet</servlet-name> 
     <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>Faces Servlet</servlet-name> 
     <url-pattern>*.xhtml</url-pattern> 
    </servlet-mapping> 
</web-app> 

Это документ index.xhtml, в котором я пытаюсь использовать управляемый компонент DataFetchBean CDI:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:h="http://xmlns.jcp.org/jsf/html" 
     xmlns:ui="http://xmlns.jcp.org/jsf/facelets" 
     xmlns:f="http://xmlns.jcp.org/jsf/core" xmlns:c="http://java.sun.com/jsp/jstl/core"> 
<h:head> 
    <title>Hello, JDBC!</title> 
</h:head> 
<h:body> 
    <table> 
     <tr> 
      <td>First name</td> 
     </tr> 
     <c:forEach items="#{dataFetchBean.questions}" var="question"> 
      <tr> 
       <td> 
        #{question} 
       </td> 
      </tr> 
     </c:forEach> 
    </table> 
</h:body> 
</html> 

Я использую Wildfly 10.0.10. Заранее спасибо!

+0

Где и как вы используете этот компонент? Работает ли он, если вы вводите и используете компонент в сервлете? – flo

+0

Я использую это в документе .xhtml в теге c: forEach JSF, например: items = # {dataFetchBean.questions}, var = "question" – masm64

+0

Необходимо внедрить ресурсы '@ Resource' в CDI beans. Я предполагаю, что способ определения источника данных вызывает проблемы. Вы можете попытаться определить источник данных в подсистеме Wildfly, а не в веб-приложении. –

ответ

0

Решение заключалось в создании источника данных Non-XA с помощью консоли Wildfly. Это включало добавление драйвера соединителя mysql в веб-контейнер. После этого вы можете легко ввести источник данных в свое приложение.

0

Проблема решена, но сервлеты должны быть тонкими. С многоуровневой архитектурой вы можете получить гораздо более гибкое решение.

+0

Спасибо за подсказку! Я думаю, что я буду использовать Hibernate для доступа и записи данных в мою базу данных. Должен ли я включить логику в EJB или использовать шаблон объекта доступа к данным, который я нашел в книге? – masm64

+0

Используйте EJB в качестве служебных фасадов (для транзакций с безопасностью в контейнере + транзакции) и используйте инъецированные объекты как элементы уровня «Busines + Data Access Layer» для максимальной гибкости. –

+0

Спасибо за подсказки! – masm64

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