1

私は春のセキュリティのために新しいです。外部プロパティ ファイルから注釈を介して値を挿入する方法に関する多くの投稿を見てきました。私は多くの方法を試しましたが、常に java.lang.IllegalArgumentException: Could not resolve placeholder 'val.id' 例外で終わります。

この例外を処理するためのヒントを教えてください。

私のJavaクラスは次のとおりです。

@Controller
public class Employee {
    @Value("${val.id}") 
    public String valId;

    public String getValId() {
        return valId;
    }

    public void setValId(String valId) {
        this.valId = valId;
    }

私のプロパティ ファイルは、WEB-INF の下にある val.properties と呼ばれ、その内容は val.id=xyz です。

以下をメインコンテキスト Bean に入れます。

<context:property-placeholder location="/WEB-INF/*.properties" />
<bean id="valProp" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
        p:location="/WEB-INF/val.properties"/>

A continuous question:

上記の回答を受け入れたので、プロパティ ファイルから注釈付き Bean への値の注入は正常に機能します。しかし、同じ手順で @PreAuthorize(...) アノテーションに注入することはできません。

「update」というメソッドを保護したいとします。このメソッドは、valId が empId と等しい場合にのみ許可されます。valId と empId の値は、val.properties ファイルで初期化されます。

私のJava Beanは次のとおりです。

public class Employee {
    public String valId;
    public String empId;

    public String getValId() {
        return valId;
    }

    public void setValId(String valId) {
        this.valId = valId;
    }

    public String getEmpId() {
        return empId;
    }

    public void setEmpId(String empId) {
        this.empId = empId;
    }
}

私のプロパティファイルには次が含まれています: val.id=nn emp.id=nn

メインコンテキストファイルにプレースホルダー構成があります:

<context:property-placeholder location="/WEB-INF/*.properties" />
<bean id="valProp" class="org.springframework.beans.factory.config.PropertiesFactoryBean"
        p:location="/WEB-INF/val.properties"/>

私の PreAuthorize アノテーション(メソッドセキュリティ)は次のとおりです。

@PreAuthorize("(#{valProp['val.id']} == #{valProp['emp.id']})")
public boolean update(){
  //if accessable
  return true;
}

しかし、式#{valProp['val.id']} == #{valProp['emp.id']}は評価されません。

値を挿入するのに何か間違いをしましたか? メンバー変数に注釈を付けると機能しましたが、ここでは機能しません。何かアイデアはありますか?前もって感謝します。

4

2 に答える 2

1

次のことを考えてみてください

1)。注釈を次のように変更します。

@Value("#{valProp['val.id']}")

2)。PropertyPlaceholderConfigurerで置き換えPropertiesFactoryBeanます。

これで例外が解決されることを願っています。

于 2013-11-03T21:53:22.303 に答える
0

例外がスローされる理由は、値を解決できない場合にデフォルトでプロパティ プレースホルダーが例外をスローするためです。さらに、おそらくすべての値を解決できるわけではない 2 つのプロパティ プレースホルダーがあります。

この動作は、ignore-unresolvable プロパティを設定することで変更できます。

<context:property-placeholder location="/WEB-INF/*.properties" ignore-unresolvable="true" />

<bean id="valProp" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
    p:location="/WEB-INF/val.properties" p:ignoreUnresolvablePlaceholders="true" />

ただし、この機能をオフにすると、プロパティ ファイル内のタイプミスは検出されないことに注意してください。

于 2013-11-03T20:59:06.903 に答える