私は値の出力を整数にキャストしようとしています:
@Value("${api.orders.pingFrequency}")
private Integer pingFrequency;
上記はエラーをスローします
org.springframework.beans.TypeMismatchException:
Failed to convert value of type 'Java.lang.String' to required type 'Java.lang.Integer';
nested exception is Java.lang.NumberFormatException:
For input string: "(Java.lang.Integer)${api.orders.pingFrequency}"
@Value("(Java.lang.Integer)${api.orders.pingFrequency}")
も試しました
Googleはこの件についてあまり語っていないようだ。使用されているすべての場所でこの値を解析する代わりに、常に整数を処理したいと思います。
回避策
回避策はセッターメソッドを使用して変換を実行することですが、Springで実行できる場合は、Springについて何かを学びたいと思います。
クラスパスに以下を含むプロパティファイルがあると仮定します
api.orders.pingFrequency=4
@Controller
で試しました
@Controller
public class MyController {
@Value("${api.orders.pingFrequency}")
private Integer pingFrequency;
...
}
私のサーブレットコンテキストに含まれるもの:
<context:property-placeholder location="classpath:myprops.properties" />
完璧に機能しました。
そのため、プロパティが整数型ではないか、プロパティプレースホルダーが正しく構成されていないか、間違ったプロパティキーを使用しています。
無効なプロパティ値4123;
で実行しようとしました。私が得た例外は
Java.lang.NumberFormatException: For input string: "4123;"
あなたの財産の価値は
api.orders.pingFrequency=(Java.lang.Integer)${api.orders.pingFrequency}
インターネットで答えを探していたところ、次のことがわかりました
@Value("#{new Java.text.SimpleDateFormat('${aDateFormat}').parse('${aDateStr}')}")
Date myDate;
だからあなたの場合はこれで試すことができます
@Value("#{new Integer('${api.orders.pingFrequency}')}")
private Integer pingFrequency;
プロパティファイルからプロパティを整数に変換する場合は、2ソリューションが見つかりました。
与えられたシナリオ:customer.propertiesはフィールドとしてcustomer.id = 1を含み、スプリング設定ファイルでintegerとしてアクセスしたいプロパティcustomerIdは、Beanでint型として宣言されますCustomer
解決策1:
<property name="customerId" value="#{T(Java.lang.Integer).parseInt('${customer.id}')}" />
上記の行では、プロパティファイルのstring値はintタイプに変換されます。
解決策2:propertiesの代わりに他の拡張子を使用します。例:プロパティファイル名がcustomer.propertiesの場合、それを作成しますcustomer.details =および構成ファイルでは以下のコードを使用します
<property name="customerId" value="${customer.id}" />
私はまったく同じ状況でした。これは、Springコンテキストに PropertySourcesPlaceholderConfigurer がないために発生し、クラス内の@Value
アノテーションに対して値を解決します。
問題を解決するプロパティプレースホルダーを含めます。整数にSpring式を使用する必要はありません(ignore-resource-not-found="true"
を使用する場合、プロパティファイルは存在する必要はありません)。
<context:property-placeholder location="/path/to/my/app.properties"
ignore-resource-not-found="true" />
@Configuationを使用している場合は、静的Beanの下にインスタンス化します。静的でない場合、@ Configutationは非常に早くインスタンス化され、@ Value、@ Autowiredなどの注釈を解決する責任があるBeanPostProcessorsはそれを実行できません。参照 こちら
@Bean
public static PropertySourcesPlaceholderConfigurer propertyConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
これを使って解決したのと同じ問題がありました。これを参照してください Spring MVC:@Valueアノテーションは、*。propertiesファイルで定義されたint値を取得します
@Value(#{propertyfileId.propertyName})
働く
@Valueを使用する場合は、クラスに@PropertySourceアノテーションを追加するか、Springのxmlファイルでプロパティホルダーを指定する必要があります。例えば。
@Component
@PropertySource("classpath:config.properties")
public class BusinessClass{
@Value("${user.name}")
private String name;
@Value("${user.age}")
private int age;
@Value("${user.registed:false}")
private boolean registed;
}
config.properties
user.name=test
user.age=20
user.registed=true
これは動作します!
もちろん、注釈の代わりにプレースホルダーxml構成を使用できます。 spring.xml
<context:property-placeholder location="classpath:config.properties"/>
私の場合、問題はPOSTリクエストがGETと同じurlに送信され(「?.. = ..」を使用してgetパラメーターを使用)、パラメーターがフォームパラメーターと同じ名前を持つことでした。おそらくSpringはそれらを配列にマージしており、解析はエラーを投げていました。
この問題は、同じファイル名を持つ2つのリソースがある場合にも発生します。クラスパス内で設定された2つの異なるjarまたはディレクトリパス内の「configurations.properties」と言います。例えば:
プロセスまたはWebアプリケーション(jar、war、またはear)に「configurations.properties」があります。ただし、別の依存関係(jar)には、同じパスに同じファイル "configurations.properties"があります。それから、Springには、プロパティを取得する場所がわからず(@ _ @?)、@ Valueアノテーション内で宣言されたプロパティ名を送信するだけだと思います。