2010-10-24 3 views
2

Я пытаюсь получить некоторые валидаторы работы с Spring 3. Я получаю сообщение об ошибке:Spring 3 Ошибка проверки

org.springframework.beans.NotReadablePropertyException: Invalid property 'name' of bean class [java.lang.String]: Bean property 'name' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter?

Мой вопрос, это то, что ошибка в виду. Я считаю, что в методе rejectValue он вызывает getName() на myobj. Это говорит о том, что myobj.getName() не существует? Потому что я могу сказать, что так оно и есть. В противном случае этот метод даже не будет компилироваться.

public void validate(Object target, Errors errors) { 
    MyObject myobj = (MyObject)target; 

    String name = myobj.getName(); 
    if(name.length() >100 || name.length() < 10) { 
     errors.rejectValue("name", "fieldLength"); 
    } 
} 

Вот MyObject:

public class MyObject { 

public MyObject() { 
    super(); 
    // TODO Auto-generated constructor stub 
} 

private String name; 

public String getName() { 
    return name; 
} 

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

}

И в моем JSP:

<form:form name="MyForm" commandName="myobj" method="post" action="${testurl}"> 
    <table id="mytable" width="100%"> 

    <tbody> 
     <tr> 
     <td colspan="2"> 
      <form:errors path="name"/> 
     </td> 
     </tr> 

    <tr> 
     <td> 
      Name: 
     </td> 
     <td> 
      <form:input path="name"/> 
     </td> 


    </tr> 

    </tbody> 
</table> 

Мой контроллер:

@ActionMapping(params="myaction=test") 
public void test(@ModelAttribute("myobj") MyObject myobj, BindingResult bindingResult, 
     ActionRequest request, ActionResponse response, SessionStatus sessionStatus) { 
    } 
    testValidator.validate(myobj, bindingResult); 
    if (!bindingResult.hasErrors()) { 
     response.setRenderParameter("myaction", "nextpage"); 
    } else { 
     response.setRenderParameter("myaction", "test"); 
    } 
} 
+0

Можете ли вы показать нам код класса 'MyObject'? – skaffman

+0

Я отредактировал, чтобы добавить это. – Michaela

+2

Почему сообщение об ошибке говорит 'MyObj' вместо' MyObject'? – axtavt

ответ

1

Раздражает, кажется, что код был прав все время. Я, наконец, управлял maven чистым, а затем перестраивался и перераспределялся, а также очищал весь кеш и т. Д., И теперь он работает с этим кодом. Я собираюсь изменить его, чтобы попытаться приблизиться к тому, что я действительно хочу (вложенные проверки), и посмотреть, где я получу с этим.

1

Скорее всего, это говорит о том, что некоторое выражение EL не работает, потому что Spring не может понять, какой тип свойства «name» основан на сигнатурах getter/setter. Если вы показали нам декларацию (всех) геттеров и сеттеров для «имени», возможно, мы можем быть более конкретными.

+0

Просто отредактирован, чтобы добавить это. – Michaela

+0

Я столкнулся с той же проблемой, которая возникла из-за неправильного запроса почты (я неправильно отправлял данные массива), что привело к сбою моего кода проверки с тем же исключением. –

0

I догадка Ваша проблема не имеет ничего общего с валидацией. Я могу только подозревать, что код, который вы вставляете, - это не ваш пример, а ручной дизайн, вдохновленный действительно выполненным кодом.

Должно быть какая-то основная проблема с MyObject property name. Моя личная догадка заключается в том, что геттер определен в суперклассе MyObject, и только сеттер переопределяется (или переопределяется) в классе MyObject.

В любом случае, лучший совет, который у меня может быть для вас, - попытаться извлечь минимальный пример вашего кода и попытаться запустить его. Даже если по каким-то причинам вы не можете поделиться с нами примером, это облегчит вам поиск причин ваших проблем.

+0

Нет, это мой пример. – Michaela

0

Это случилось со мной с весной Validator, которая продолжала жаловаться на две нечитаемые свойства в моем домене POJO. Один из них был java.lang.Boolean, другой был java.lang.Integer, и оба они имели обычные Java-Beyans обычные геттеры и сеттеры.

Через некоторое копаться я обнаружил инициализирован логическое свойство с:

@value ("Т {Boolean.FALSE}")

и свойство Integer с:

@value («0»)

Это был результат предыдущего учебного проекта. В любом случае, после удаления, эти неприятные ошибки нечитаемого свойства прекратились, и валидатор начал выполнять свою работу.

Смежные вопросы