Java 我不断得到';NotReadablePropertyException';针对新的Spring验证程序类运行单元测试时
我正在通过SpringMVC创建一个基本的登录页面。到目前为止,我已经创建了以下内容:Java 我不断得到';NotReadablePropertyException';针对新的Spring验证程序类运行单元测试时,java,spring,spring-validator,Java,Spring,Spring Validator,我正在通过SpringMVC创建一个基本的登录页面。到目前为止,我已经创建了以下内容: 一个简单的“login”POJO类 实现spring接口的“LoginValidator”类:org.springframework.validation.Validator “LoginValidatorTests”类 我的单元测试失败,出现以下异常: org.springframework.beans.NotReadablePropertyException: Invalid property 'lo
- 一个简单的“login”POJO类
- 实现spring接口的“LoginValidator”类:org.springframework.validation.Validator
- “LoginValidatorTests”类
org.springframework.beans.NotReadablePropertyException: Invalid property 'login' of bean class [springapp.service.LoginValidator]: Bean property 'login' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter?
at org.springframework.beans.BeanWrapperImpl.getPropertyValue(BeanWrapperImpl.java:707)
at org.springframework.beans.BeanWrapperImpl.getPropertyValue(BeanWrapperImpl.java:699)
at org.springframework.validation.AbstractPropertyBindingResult.getActualFieldValue(AbstractPropertyBindingResult.java:99)
at org.springframework.validation.AbstractBindingResult.rejectValue(AbstractBindingResult.java:105)
at springapp.service.LoginValidator.validateUsername(LoginValidator.java:44)
at springapp.service.LoginValidator.validate(LoginValidator.java:27)
at springapp.service.LoginValidatorTests.testEmptyUsernameAndPassword(LoginValidatorTests.java:28)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at junit.framework.TestCase.runTest(TestCase.java:164)
at junit.framework.TestCase.runBare(TestCase.java:130)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:120)
at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
package springapp.service;
import junit.framework.TestCase;
import springapp.service.LoginValidator;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.validation.BeanPropertyBindingResult;
import org.springframework.validation.Validator;
import org.springframework.validation.Errors;
public class LoginValidatorTests extends TestCase {
protected final Log logger = LogFactory.getLog(getClass());
private LoginValidator loginValidator = new LoginValidator();
private Login login= new Login();
private Errors errors = new BeanPropertyBindingResult(loginValidator, "loginValidator");
public void testEmptyUsernameAndPassword(){
login.setPassword("ee");
login.setUsername("ee");
loginValidator.validate(login, errors);
assertTrue(errors.hasErrors());
//assertTrue(errors.getFieldError().toString().contains("error.username-and-password-required"));
}
public void testEmptyUsernameOnly(){
}
public void testEmptyPasswordOnly(){
}
public void testInvalidUsername(){
}
public void testInvalidPassword(){
}
}
下面是代码狙击手
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class Login{
/** Logger for this class and subclasses */
protected final Log logger = LogFactory.getLog(getClass());
private String username;
private String password;
public void setUsername(String username){
this.username = username;
}
public String getUsername(){
return username;
}
public void setPassword(String password){
this.password = password;
}
public String getPassword(){
return password;
}
}
package springapp.service;
import org.springframework.validation.Validator;
import org.springframework.validation.Errors;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
//import springapp.domain.Login;
public class LoginValidator implements Validator {
/** Logger for this class and subclasses */
protected final Log logger = LogFactory.getLog(getClass());
public boolean supports(Class clazz) {
return Login.class.equals(clazz);
}
public void validate(Object obj, Errors errors) {
Login login = (Login) obj;
if (login == null) {
errors.rejectValue("login", "error.username-and-password-required", null, "Value required.");
}
//validate username
validateUsername(login, errors);
//if no errors, validate password
if (!errors.hasErrors()){
validatePassword(login, errors);
}
}
private boolean validateUsername(Login login, Errors errors){
String username = login.getUsername();
if (username == null || username.length() == 0){
errors.rejectValue("login", "error.username-required", null, "Value required.");
return false;
}
if (username != "admin") {
errors.rejectValue("login", "error.username-not-found", null, "Value required.");
return false;
}
return true;
}
private boolean validatePassword(Login login, Errors errors){
String password = login.getPassword();
if (password == null || password.length() == 0){
errors.rejectValue("login", "error.password-required", null, "Value required.");
return false;
}
if (password != "admin") {
errors.rejectValue("login", "error.password-invalid", null, "Value required.");
return false;
}
return true;
}
}
org.springframework.beans.NotReadablePropertyException: Invalid property 'login' of bean class [springapp.service.LoginValidator]: Bean property 'login' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter?
at org.springframework.beans.BeanWrapperImpl.getPropertyValue(BeanWrapperImpl.java:707)
at org.springframework.beans.BeanWrapperImpl.getPropertyValue(BeanWrapperImpl.java:699)
at org.springframework.validation.AbstractPropertyBindingResult.getActualFieldValue(AbstractPropertyBindingResult.java:99)
at org.springframework.validation.AbstractBindingResult.rejectValue(AbstractBindingResult.java:105)
at springapp.service.LoginValidator.validateUsername(LoginValidator.java:44)
at springapp.service.LoginValidator.validate(LoginValidator.java:27)
at springapp.service.LoginValidatorTests.testEmptyUsernameAndPassword(LoginValidatorTests.java:28)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at junit.framework.TestCase.runTest(TestCase.java:164)
at junit.framework.TestCase.runBare(TestCase.java:130)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:120)
at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
package springapp.service;
import junit.framework.TestCase;
import springapp.service.LoginValidator;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.validation.BeanPropertyBindingResult;
import org.springframework.validation.Validator;
import org.springframework.validation.Errors;
public class LoginValidatorTests extends TestCase {
protected final Log logger = LogFactory.getLog(getClass());
private LoginValidator loginValidator = new LoginValidator();
private Login login= new Login();
private Errors errors = new BeanPropertyBindingResult(loginValidator, "loginValidator");
public void testEmptyUsernameAndPassword(){
login.setPassword("ee");
login.setUsername("ee");
loginValidator.validate(login, errors);
assertTrue(errors.hasErrors());
//assertTrue(errors.getFieldError().toString().contains("error.username-and-password-required"));
}
public void testEmptyUsernameOnly(){
}
public void testEmptyPasswordOnly(){
}
public void testInvalidUsername(){
}
public void testInvalidPassword(){
}
}
private Errors errors = new BeanPropertyBindingResult(login, "login" /* or whatever name */);
否则,错误
的目标对象是登录验证器
对象,而不是登录
对象
请注意
字段-字段名(可能为空或空字符串)
那么您在这里指定了什么
errors.rejectValue("login", "error.username-required", null, "Value required.");
值login
实际上用作目标对象类的字段名。但是您的Login
类和LoginValidator
类都没有这样的字段。您应该在适当的情况下使用用户名
或密码
。首先
应该是
private Errors errors = new BeanPropertyBindingResult(login, "login" /* or whatever name */);
否则,错误
的目标对象是登录验证器
对象,而不是登录
对象
请注意
字段-字段名(可能为空或空字符串)
那么您在这里指定了什么
errors.rejectValue("login", "error.username-required", null, "Value required.");
值
login
实际上用作目标对象类的字段名。但是您的Login
类和LoginValidator
类都没有这样的字段。您应该在适当的情况下使用username
或password
。查看堆栈跟踪,很可能您在类“LoginValidator”中的属性“login”没有声明Get和Set方法,或者这些方法编写不正确
尝试将Get/Set方法包括到属性“login”中,或者更正旧方法以返回正确的对象类型,当然,这两种方法都在类“LoginValidator”中。查看堆栈跟踪,类“LoginValidator”中的属性“login”很可能没有声明Get和Set方法,或者这些方法写得不正确
尝试将Get/Set方法包括到属性“login”中,或者更正旧方法以返回正确的对象类型,当然,这两种方法都在类“LoginValidator”中。应用程序上下文在哪里?请发布堆栈跟踪的其余部分@Youngistan这里不需要
ApplicationContext
。你是说*servlet.xml文件吗?@Sotirios Delimanolis,我已经更新了我的帖子,包含了完整的堆栈跟踪。你的属性名是password
而不是login
,将rejectValue
的第一个参数更改为login
。应用程序上下文在哪里?请发布堆栈跟踪的其余部分@Youngistan这里不需要ApplicationContext
。你是说*servlet.xml文件吗?@Sotirios Delimanolis,我已经更新了我的帖子,包含了完整的堆栈跟踪。你的属性名是password
而不是login
,将rejectValue
的第一个参数更改为login
。他们为什么要对非beanLoginValidator
类执行bean验证?堆栈跟踪提示如下:bean类[springapp.service.LoginValidator]的属性“login”无效,让我们拭目以待,看看我的解决方案在这种情况下是否有效。在我正在处理的项目中,NotReadablePropertyException遇到了一些问题,Get/Set方法解决了这个问题。是的,您对错误发生原因的分析是正确的。但你建议的更正是错误的。你看不到更大的图景。他们为什么要对非beanLoginValidator
类执行bean验证?堆栈跟踪提示如下:bean类[springapp.service.LoginValidator]的属性“login”无效,让我们拭目以待,看看我的解决方案在这种情况下是否有效。在我正在处理的项目中,NotReadablePropertyException遇到了一些问题,Get/Set方法解决了这个问题。是的,您对错误发生原因的分析是正确的。但你建议的更正是错误的。你看的不是大局,太棒了,谢谢。现在说得通了。@Sudhir,不客气。作为一个建议,考虑升级JUnit测试环境。现在说得通了。@Sudhir,不客气。作为一个建议,考虑升级JUnit测试环境。