2017-01-25 56 views
1
にゲッターメソッドをスローしません

ご覧のとおり、TemplateVarsクラスのプロパティ 'name'のゲッターがあります。同様のコードは、システムのどこかで動作します。なぜ次のコードが次の例外を投げているのですか?Java PropertyUtils.getPropertyはクラス

コード

public class Main { 

    public static void main(String[] args) throws IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException { 
     String template = "Hello. My name is %%name%% %%surname%% %%contact.email%%"; 
     Pattern pattern = Pattern.compile("%%(.*?)%%"); 
     Matcher matcher = pattern.matcher(template); 

     TemplateVars item = new TemplateVars(); 

     while (matcher.find()) { 
      String placeHolder = matcher.group(1); 
      String value; 

      if(placeHolder.contains(".")){ 
       value = PropertyUtils.getNestedProperty(item, placeHolder).toString(); 
      }else{ 
       value = PropertyUtils.getProperty(item,placeHolder).toString(); 
      } 
      template = template.replace("%%" + placeHolder + "%%", value); 
     } 

     System.out.println(template); 
    } 

} 

class TemplateVars { 
    private String name = "Boo"; 
    private String surname = "Foo"; 
    private Contact contact; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getSurname() { 
     return surname; 
    } 

    public void setSurname(String surname) { 
     this.surname = surname; 
    } 

    public Contact getContact() { 
     return contact; 
    } 

    public void setContact(Contact contact) { 
     this.contact = contact; 
    } 
} 

class Contact { 
    private String email = "[email protected]"; 

    public String getEmail() { 
     return email; 
    } 

    public void setEmail(String email) { 
     this.email = email; 
    } 
} 

例外

Exception in thread "main" java.lang.NoSuchMethodException: Property 'name' has no getter method in class 'class TemplateVars' 
    at org.apache.commons.beanutils.PropertyUtilsBean.getSimpleProperty(PropertyUtilsBean.java:1274) 
    at org.apache.commons.beanutils.PropertyUtilsBean.getNestedProperty(PropertyUtilsBean.java:808) 
    at org.apache.commons.beanutils.PropertyUtilsBean.getProperty(PropertyUtilsBean.java:884) 
    at org.apache.commons.beanutils.PropertyUtils.getProperty(PropertyUtils.java:464) 
    at Main.main(Main.java:24) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147) 

私は上記の投稿したコードの一部のみがコンセプトの証明として働くことです。

+0

REAL [mcve]:A)必須ではないコンテンツ(そこに一致するパターンのようなもの)とB)簡単にコンパイルして実行できるもの。 – GhostCat

+0

@GhostCat私が知る限り、* MCVEです。 –

+1

それは確かに最小限ではありません。繰り返しますが、パターンマッチングにはどのようなことがありますか? – GhostCat

答えて

7

これは、クラスTemplateVarsContactにパッケージローカルアクセス修飾子があり、PropertyUtilsがそれらにアクセスできないためです。

これを解決するには、それらをトップクラス(public)またはpublic staticの内部クラスMainクラスにします。

+0

静的な内部クラスであっても公開されていなければなりません。私はこの動作のためのドキュメントを見つけることができませんでした –

+0

@defaultlocale確かに、私はそれを意味したが、言及するのを忘れてしまった。ありがとう、私は更新しました – Andremoniy