2

私は研究のための私のプロジェクトで次の問題を抱えています。CDI を使用した単純なサーブレット プロジェクトで BeansValidation を動作させる必要があります。Bean の検証をスコープ アノテーションで注釈を付けた cdi Bean で機能させたいのですが、今のところ、そのような Bean を検証しようとすると (エラーがあっても)、バリデーターはエラーがまったくないと主張します。

さらに、EL 言語を使用して Bean のプロパティをリクエストの値に設定すると便利です。これは、スコープ アノテーションを持つ Bean では機能するようですが、他の Bean では機能しません。

CDIプロキシに問題があると思いますが、解決方法がわかりません。Maven を使用してアプリケーションをビルドし、Jboss 7.1.1.Final にデプロイします。

私のプロジェクトのすべてのソースは次のとおりです。

スコープ アノテーション付きの Bean:

package pl.lab3.bean;

import javax.enterprise.context.RequestScoped;
import javax.inject.Named;
import javax.validation.constraints.Size;

@Named
@RequestScoped
public class Scoped {
    @Size(max = 2)
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

スコープ アノテーションのない Bean:

package pl.lab3.bean;

import javax.inject.Named;
import javax.validation.constraints.Size;

@Named
public class Data {
    @Size(max = 2)
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

サーブレット:

package pl.lab3.servlet;

import pl.lab3.bean.Data;
import pl.lab3.bean.Scoped;

import javax.el.ELContext;
import javax.el.ExpressionFactory;
import javax.inject.Inject;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.ConstraintViolation;
import javax.validation.Validator;
import java.io.IOException;
import java.util.Set;

public class ServletDispatcher extends HttpServlet {
    @Inject
    private Validator validator;
    @Inject
    private ELContext elContext;
    @Inject
    private ExpressionFactory expressionFactory;
    @Inject
    private Scoped scoped;
    @Inject
    private Data data;

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,
            IOException {
        this.request(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException,
            IOException {
        this.request(request, response);
    }

    private void request(HttpServletRequest request, HttpServletResponse response)
            throws IOException {
        try {
            expressionFactory.createValueExpression(elContext, "${scoped.name}", String.class)
                    .setValue(elContext, "test");
            String goodValue = scoped.getName(); //returns test, as expected
            //but in debugger it's still null(first screen)
            Set<ConstraintViolation<Scoped>> emptySet = validator.validate(scoped); //doesn't work, returns empty set

            scoped.setName("test2");
            String goodValue2 = scoped.getName(); //obviously works, but still null in debugger(same first screen, just nothing happened)
            Set<ConstraintViolation<Scoped>> emptySet2 =
                    validator.validate(scoped); //doesn't work too, returns empty set

            expressionFactory.createValueExpression(elContext, "${data.name}", String.class)
                    .setValue(elContext, "test");
            String badValue = data.getName(); //above doesn't work, and in debugger too(second screen)
            Set<ConstraintViolation<Data>> emptySet3 = validator.validate(data); //empty set...

            data.setName("test2");
            String goodValue3 = data.getName(); //obviously works, and I can see good value in debugger(third screen)
            Set<ConstraintViolation<Data>> errors = validator.validate(data); //and here I've got expected error

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

サーブレット コードで言及されているデバッガーのスクリーンショット:

スクリーン1:

スコープ Bean と null 値を持つ screen1

スクリーン2:

ここに画像の説明を入力

スクリーン3:

ここに画像の説明を入力

そして、いくつかの(私が思うに)あまり重要でないファイル:

web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>pl.lab3.servlet.ServletDispatcher</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>

</web-app>

ビーンズ.xml

<?xml version="1.0"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://jboss.org/schema/cdi/beans_1_0.xsd">
</beans>

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>lab</groupId>
    <version>1.0</version>
    <artifactId>lab3-validation</artifactId>
    <packaging>war</packaging>
    <name>lab3-validation</name>

    <dependencies>
        <dependency>
            <groupId>org.jboss.seam.validation</groupId>
            <artifactId>seam-validation</artifactId>
            <version>3.1.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.jboss.spec</groupId>
            <artifactId>jboss-javaee-web-6.0</artifactId>
            <version>3.0.2.Final</version>
            <type>pom</type>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.jboss.weld.servlet</groupId>
            <artifactId>weld-servlet</artifactId>
            <version>2.0.1.Final</version>
        </dependency>
    </dependencies>

    <repositories>
        <repository>
            <id>JBoss repository</id>
            <url>http://repository.jboss.org/nexus/content/groups/public/</url>
        </repository>
    </repositories>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.0</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
            </plugin>
        </plugins>
        <finalName>validation</finalName>
    </build>

</project>
4

2 に答える 2

4

これは、CDI オブジェクトが CDI コンテナーによって管理されているためです。バリデーターがクラスを見つけようとすると、処理しているオブジェクトではなく、プロキシ クラス名が取得されます。モデル/トランスポート オブジェクトを CDI 管理にしないでください。

于 2013-10-15T22:26:19.793 に答える