Модель не внедряется в сервлет

У меня есть простой проект сервлета: мне нужно внедрить зависимость в экземпляр сервлета. Пробовал несколько аннотаций: Default, Singlton, EJB, ManagedBean, ничего не помогает.

Часть POM.xml

<build>
    <resources>
        <resource>
          <directory>src/main/resources</directory>
        </resource>
    </resources>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.1</version>
            <configuration>
                <source>1.7</source>
                <target>1.7</target>

                <compilerArguments>
                    <endorseddirs>${endorsed.dir}</endorseddirs>
                </compilerArguments>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>2.3</version>
            <configuration>
                <failOnMissingWebXml>false</failOnMissingWebXml>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>2.6</version>
            <executions>
                <execution>
                    <phase>validate</phase>
                    <goals>
                        <goal>copy</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${endorsed.dir}</outputDirectory>
                        <silent>true</silent>
                        <artifactItems>
                            <artifactItem>
                                <groupId>javax</groupId>
                                <artifactId>javaee-endorsed-api</artifactId>
                                <version>7.0</version>
                                <type>jar</type>
                            </artifactItem>
                        </artifactItems>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

Сервлет

@WebServlet(urlPatterns = {"/updater_servlet"},loadOnStartup = 1)
public class Updater_servlet extends HttpServlet
{
    private final static org.slf4j.Logger logger = LoggerFactory.getLogger(Updater_servlet.class);

    @Inject
    private UpdatesModel updates;

    /**
     * Handles the HTTP <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        ...
    }

Класс модели

@Model
public class UpdatesModel implements Serializable
{
    private final static org.slf4j.Logger logger = LoggerFactory.getLogger(UpdatesModel.class);

    private final String url;
    private final String username;
    private final String password;
    private final String instpath;

    public UpdatesModel()
    {
        Properties prop = new Properties();

        try
        {
            Class.forName(driverName);
            prop.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("config.properties"));
        }
        catch (ClassNotFoundException|IOException ex)
        {
            Logger.getLogger(UpdatesModel.class.getName()).log(Level.SEVERE, null, ex);
        }

        url          = "jdbc:mysql://" + serverName + "/" + prop.getProperty("database","");
        username     = prop.getProperty("dbuser","");
        password     = prop.getProperty("dbpassword","");

        instpath     = prop.getProperty("instpath","");
    }

Поле Updates никогда не инициализируется. Это равно нулю. Что я сделал не так?

ОБНОВЛЕНИЕ: зависимости:

<dependencies>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.7</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>jcl-over-slf4j</artifactId>
        <version>1.7.7</version>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.7.7</version>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>javax.enterprise</groupId>
        <artifactId>cdi-api</artifactId>
        <version>1.2</version>
        <scope>provided</scope>
    </dependency>

    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-core</artifactId>
        <version>1.10.8</version>
        <scope>test</scope>
    </dependency>
</dependencies>

Создал пустой beans.xml в WEB-INF - не помогает(( Разворачиваю на Tomcat 7. Также пробовал на tomcat 8 - без разницы((


person mor    schedule 18.12.2014    source источник
comment
Я не знаю ни одной аннотации @Model, которая работала бы с сервлетами.   -  person Luiggi Mendoza    schedule 19.12.2014
comment
Итак, что я должен использовать? Кстати, модель javax.enterprise.inject.Model   -  person mor    schedule 19.12.2014
comment
В какой контейнер вы развертываете?   -  person John Ament    schedule 19.12.2014


Ответы (2)


Прежде всего, часть вашего pom.xml совершенно не имеет отношения к проблеме ;) Часть зависимостей была бы более интересной.

Создайте или убедитесь, что существует пустой файл с именем beans.xml в каталоге WEB-INF.

Убедитесь, что у вас есть зависимость cdi-api, определенная в вашем pom.xml:

    <dependency>
        <groupId>javax.enterprise</groupId>
        <artifactId>cdi-api</artifactId>
        <scope>provided</scope>
        <version>version</version>
    </dependency>

Также убедитесь, что вы развертываете свою войну на сервере приложений с поддержкой CDI, таком как Wildfly (JBoss), или убедитесь, что у вас есть все необходимые библиотеки в пути к классам, если это простой контейнер сервлетов, такой как Tomcat.

Также хорошей практикой является внедрение конкретных реализаций в интерфейсы, поэтому ваш класс UpdatesModel должен реализовывать некоторый интерфейс, определяющий его поведение. Это не обязательно.

РЕДАКТИРОВАТЬ: зависимость от сварки необходима только в среде SE. В ЕЕ все необходимое должно быть cdi-api.

person Jiri Kremser    schedule 18.12.2014
comment
Если вы начинаете новый проект, я предлагаю клонировать образцы на Github. Вот что-то похожее, что вам нужно github.com/wildfly/quickstart/blob/master/cdi-alternative/src/ - person Jiri Kremser; 19.12.2014

Я узнал, как решить эту проблему. я добавил

 <dependency>
   <groupId>org.jboss.weld.servlet</groupId>
   <artifactId>weld-servlet</artifactId>
   <version>1.1.10.Final</version>
 </dependency>

в pom.xml и создал UpdaterRequestListener

@WebListener
public class UpdaterRequestListener extends org.jboss.weld.environment.servlet.Listener
{
}

Интересно, смогу ли я сделать это без дополнительной зависимости от сварки? Есть ли альтернатива javax?

person mor    schedule 19.12.2014