1

プロジェクトに作成されたリソース ファイルがあります。リソースファイルからSpring Beanに値を注入したい。applicacationContext.xml でリソース ファイルのプレース ホルダーを定義しました。

<context:property-placeholder  location="file:///${MRAPOR_PROPPATH}mRapor.properties" />

次のように、applicationContext.xml で宣言されている Bean に値を注入できます。

<bean
        id="dataSource"
        class="org.springframework.jndi.JndiObjectFactoryBean" >

        <property
            name="jndiName"
            value="${database.jndiName}" />

        <property
            name="lookupOnStartup"
            value="false" />

        <property
            name="cache"
            value="true" />

        <property
            name="proxyInterface"
            value="javax.sql.DataSource" />
    </bean>

これはうまくいきます。ただし、Spring アノテーションで Bean を宣言すると、値を注入できません。

@Component("SecurityFilter")
public class SecurityFilter implements Filter {
    public static final String USER = "USER_SESSION_KEY";
    public static final String CENTRIFY_USERNAME_KEY = "REMOTE_USERNAME";

    @Value("${url.logout}")//I get error here !!!!
    private String logoutUrl;
    //proper setters and  getters.
}

注釈を使用して宣言された Bean 内の値にアクセスできない理由を知っていますか。

ここに私の例外があります

weblogic.application.ModuleException: 
    at weblogic.servlet.internal.WebAppModule.startContexts(WebAppModule.java:1510)
    at weblogic.servlet.internal.WebAppModule.start(WebAppModule.java:482)
    at weblogic.application.internal.flow.ModuleStateDriver$3.next(ModuleStateDriver.java:425)
    at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:52)
    at weblogic.application.internal.flow.ModuleStateDriver.start(ModuleStateDriver.java:119)
    Truncated. see log file for complete stacktrace
Caused By: java.lang.IllegalArgumentException: Could not resolve placeholder 'url.logout' in string value [${url.logout}]
    at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:173)
    at org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:125)
    at org.springframework.beans.factory.config.PropertyPlaceholderConfigurer$PlaceholderResolvingStringValueResolver.resolveStringValue(PropertyPlaceholderConfigurer.java:255)
    at org.springframework.beans.factory.support.AbstractBeanFactory.resolveEmbeddedValue(AbstractBeanFactory.java:748)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:745)
4

2 に答える 2

0

XML は Spring Bean プロセッサによって解析されるの@Valueに対し、Java コンパイラによって処理されます - これらは 2 つの非常に異なるものです...なぜ同じように動作すると思いますか?

編集:私はそれを読んで、Spring ELを使用して実際に可能であるように思われ#ます$.

private @Value( "#{application.url.logout}" ) String logoutUrl;

乾杯、

于 2012-10-16T08:16:30.393 に答える
0

SecurityFilter実際にリクエストをフィルタリングするのインスタンスが Spring によって管理されていることは確かですか?

デフォルトFilterでは、 で宣言された s はweb.xmlサーブレット コンテナによってインスタンス化されるため、Spring および Spring アノテーションによって管理されず、@Value動作しません。

ただし、Spring はユース ケースに特別なサポートを提供します。Spring が管理するコンポーネントにフィルタリングを委任できますDelegatingFilterProxy。次のように宣言しweb.xmlます。

<filter>
    <filter-name>SecurityFilter</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter-mapping>...</filter-mapping>

DelegatingFilterProxy要求フィルタリングを名前付きの Bean に委任SecurityFilterします (あなたの のように@Component)。

于 2012-10-16T08:53:36.757 に答える