Java PropertyUtils.getProperty 在 class 中没有抛出 getter 方法
Java PropertyUtils.getProperty throws no getter method in class
如您所见,我在 class TemplateVars 中显然有一个 getter for 属性 'name'。一段类似的代码在系统的其他地方工作。那么为什么下面的代码会抛出下面的异常呢?
代码
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 = "boo.foo@mail.com";
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)
我在上面发布的这段代码仅用作概念验证。
这仅仅是因为您的 classes TemplateVars
和 Contact
具有 package-local 访问修饰符并且 PropertyUtils
无法访问它们。
要解决它,请将它们设为顶部 classes(即 public),或 public static inner classes of Main
class.
如您所见,我在 class TemplateVars 中显然有一个 getter for 属性 'name'。一段类似的代码在系统的其他地方工作。那么为什么下面的代码会抛出下面的异常呢?
代码
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 = "boo.foo@mail.com";
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)
我在上面发布的这段代码仅用作概念验证。
这仅仅是因为您的 classes TemplateVars
和 Contact
具有 package-local 访问修饰符并且 PropertyUtils
无法访问它们。
要解决它,请将它们设为顶部 classes(即 public),或 public static inner classes of Main
class.