web-dev-qa-db-ja.com

文字列から整数への@Value注釈型キャスト

私は値の出力を整数にキャストしようとしています:

@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について何かを学びたいと思います。

51
Webnet

クラスパスに以下を含むプロパティファイルがあると仮定します

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}
44

インターネットで答えを探していたところ、次のことがわかりました

@Value("#{new Java.text.SimpleDateFormat('${aDateFormat}').parse('${aDateStr}')}")
Date myDate;

だからあなたの場合はこれで試すことができます

@Value("#{new Integer('${api.orders.pingFrequency}')}")
private Integer pingFrequency;
21
Piero Divasto

プロパティファイルからプロパティ整数に変換する場合は、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}" />
7
ajay

私はまったく同じ状況でした。これは、Springコンテキストに PropertySourcesPlaceholderConfigurer がないために発生し、クラス内の@Valueアノテーションに対して値を解決します。

問題を解決するプロパティプレースホルダーを含めます。整数にSpring式を使用する必要はありません(ignore-resource-not-found="true"を使用する場合、プロパティファイルは存在する必要はありません)。

<context:property-placeholder location="/path/to/my/app.properties"
    ignore-resource-not-found="true" />
7
this

@Configuationを使用している場合は、静的Beanの下にインスタンス化します。静的でない場合、@ Configutationは非常に早くインスタンス化され、@ Value、@ Autowiredなどの注釈を解決する責任があるBeanPostProcessorsはそれを実行できません。参照 こちら

@Bean
public static PropertySourcesPlaceholderConfigurer propertyConfigurer() {
   return new PropertySourcesPlaceholderConfigurer();
}
4
V N

これを使って解決したのと同じ問題がありました。これを参照してください Spring MVC:@Valueアノテーションは、*。propertiesファイルで定義されたint値を取得します

@Value(#{propertyfileId.propertyName})

働く

1
Saurabh

@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"/>
0
warhead

私の場合、問題はPOSTリクエストがGETと同じurlに送信され(「?.. = ..」を使用してgetパラメーターを使用)、パラメーターがフォームパラメーターと同じ名前を持つことでした。おそらくSpringはそれらを配列にマージしており、解析はエラーを投げていました。

0
Krystian

この問題は、同じファイル名を持つ2つのリソースがある場合にも発生します。クラスパス内で設定された2つの異なるjarまたはディレクトリパス内の「configurations.properties」と言います。例えば:

プロセスまたはWebアプリケーション(jar、war、またはear)に「configurations.properties」があります。ただし、別の依存関係(jar)には、同じパスに同じファイル "configurations.properties"があります。それから、Springには、プロパティを取得する場所がわからず(@ _ @?)、@ Valueアノテーション内で宣言されたプロパティ名を送信するだけだと思います。

0