2016-07-01 10 views
0

groovy/grailsの設定で作業していて、文字列値に対してswitch文を実行しようとするときに問題があります。文字列値をオンにするとGroovyで予期しない結果が発生する

基本的には、Webサービスの応答の属性名をループして、ユーザーごとに構成された定義済みのマッピングと一致するかどうかを確認しています。そのフィールドにマッピングが確立されている場合は、その値を応答から引き出し、別の場所で使用します。

コードはこのようなものになります

switch(attributeName) 
{ 
    case {attributeName} : 
     log.info("Currently switching on value... ${attributeName}") 

    case user.getFirstNameMapping(): 
     model.user.userInfo.firstName = attributeValue 
     break 
    case user.getLastNameMapping(): 
     model.user.userInfo.lastName = attributeValue 
     break 
    case user.getAuthenticationKeyMapping(): 
     model.authenticationValue = attributeValue 
     break 
    case user.getEmailMapping(): 
     model.email = attributeValue.toLowerCase() 
     break 
} 

(attributeNameの)オンされる値はString型で、ユーザーインスタンスのゲッター方法はまた、String型を返します。

Groovy言語についての私の研究と理解に基づいて、StringなどのObjectの切り替えは、String.equals()を使用して比較を行う必要があります。しかし、その結果、毎回user.getFirstNameMapping()のケースで一致し、モデルの値を繰り返し上書きしてしまいます。したがって、応答に返される最後の値は保存されたもので、他の値は保存されません。

if(attributeName.equals(user.getFirstNameMapping()) 
{ 
    ... 
} 

それは罰金たびに動作します:面白い何

は、私がもし/他の構造を使用して、このような何かを行う場合ということです。私はそれが余分な空白や大文字の問題のような愚かではないことを記録を通して検証しました。

switch(true) 
{ 
    case {attributeName} : 
     log.info("Currently switching on value... ${attributeName}") 
    case {user.getFirstNameMapping().equals(attributeName)}: 
     model.user.userInfo.firstName = attributeValue 
     break 
    case {user.getLastNameMapping().equals(attributeName)}: 
     model.user.userInfo.lastName = attributeValue 
     break 
    case {user.getAuthenticationKeyMapping().equals(attributeName)}: 
     model.authenticationValue = attributeValue 
     break 
    case {user.getEmailMapping().equals(attributeName)}: 
     model.email = attributeValue.toLowerCase() 
     break 
} 

そしてそれはまだ正確に同じように私の期待を満たしていない:私はまた、デフォルトでスイッチを実行して、明示的にこのような場合にはattributeNameと比較するために周りのものを変更しようとしました。だから、なぜ私は文字列を比較するために、switch文が単に.equals()を使うべきか、ifequential()を使ってif/elseを明示的に比較するときに、これが動作であると思っています。

+0

場合{attributeNameが}たびに実行され、あなたが見れば第二の場合もそれとするたびに実行し、それになるような問題は、uはスイッチケースを使用した方法でGrailsのでは問題ではありません中断するので、スイッチが起動する前に{attributeName}の値を表示してください。 –

答えて

1

問題はスイッチケースにあります。

はこちらをご覧: -

case {attributeName} : 
     log.info("Currently switching on value... ${attributeName}") 

case user.getFirstNameMapping(): 
     model.user.userInfo.firstName = attributeValue 
     break 

スイッチ条件があるので、あなたがあなたのこの2つの場合は、すべての時間を実行します見ることができるように: -

switch(attributeName) 

だから、最初の1試合を取得しますブレークに出会うまで実行されます。後で2の場合です。つまり、case user.getFirstNameMapping():です。swtichが起動する前に{attributeName}の値を表示することをおすすめします。

希望はあなたを助けるでしょう。

おかげ

0

私はあなたの問題は何かを正確にはわかりませんが、case文はメソッドでもうまく動作します。私の例を参照してください

String something = "Foo" 

class User { 
    String firstName 
    String lastName 
} 

User u = new User(firstName: 'Something', lastName:'Foo') 

switch(something) { 
    case u.getFirstName(): 
    println "firstName: ${u.firstName}" 
    break; 
    case u.getLastName(): 
    println "lastName: ${u.lastName}" 
    break; 
    default: 
    println "nothing..." 
} 

このコードはlastNameを期待どおりに出力します。

関連する問題