Исключение привязки нового объекта Spring: Невозможно преобразовать String в long (примитивный тип) - PullRequest
0 голосов
/ 06 декабря 2010

ОС: Windows Vista, Framework: Spring (последняя версия), JQuery (последняя версия), Hibernate (последняя версия).

У меня есть класс домена с первичным ключом в качестве длинного идентификатора.

public class domain{
    private long id;
    ....
}

Определение моего контроллера:

    @RequestMapping("/domainJqgridData/save")
public @ResponseBody String saveJqgridData(DomainClass domainclass) throws Exception {  
    return "Saved successfully!";
}

Когда форма JSP отправляется для добавления новой записи DomainClass, контроллер Spring пытается автоматически привязать параметры запроса к классу домена. Выдает исключение BindException следующим образом:

Ошибка обработки запроса; вложенным исключением является org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 ошибка Ошибка поля в объекте «домен» в поле «идентификатор»: отклоненное значение [_empty]; коды [typeMismatch.domainclass.id, typeMismatch.id, typeMismatch.long, typeMismatch]; аргументы [org.springframework.context.support.DefaultMessageSourceResolvable: codes [domainclass.id, id]; аргументы []; сообщение по умолчанию [id]]; сообщение по умолчанию [Не удалось преобразовать значение свойства типа 'java.lang.String' в требуемый тип 'long' для свойства 'id'; вложенным исключением является org.springframework.core.convert.ConversionFailedException: невозможно преобразовать значение «_empty» из типа «java.lang.String» в тип «long»; вложенное исключение - java.lang.NumberFormatException: для входной строки: "_empty"] org.springframework.web.servlet.FrameworkServlet.processRequest (FrameworkServlet.java:656) org.springframework.web.servlet.FrameworkServlet.doPost (FrameworkServlet.java:560) javax.servlet.http.HttpServlet.service (HttpServlet.java:637) javax.servlet.http.HttpServlet.service (HttpServlet.java:717) org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal (CharacterEncodingFilter.java:88)

Когда я добавляю новую запись DomainClass, поле id передается как нулевое в форме JSP. Spring преобразует пустой идентификатор в пустое строковое значение для привязки и выдает ошибку. Я просмотрел сеть и обнаружил, что могу зарегистрировать собственные редакторы для этой цели. Я изменил длинный идентификатор определения типа примитива DomainClass на Long id и попытался привязать пользовательский редактор следующим образом.

Controller class:
@InitBinder
public void initBinder(WebDataBinder binder) { 
    binder.registerCustomEditor(Long.class, new CustomPrimitiveFormat(Long.class, true));
    binder.registerCustomEditor(String.class, new StringTrimmerEditor(true));
}

Мой пользовательский класс редактора примитивов выглядит следующим образом:

public class CustomPrimitiveFormat extends CustomNumberEditor{

public CustomPrimitiveFormat(Class numberClass, boolean allowEmpty)
    throws IllegalArgumentException {
    super(numberClass, allowEmpty);
    // TODO Auto-generated constructor stub
}

public void setValue(Object value){
    System.out.println("Entered CustomPrimitiveFormat setValue");
    if (value == null) {
        super.setValue(null);
        return;
    }
    if (value.getClass().equals(String.class)){
        if (StringUtils.isEmpty((String)value)){
            super.setValue(null);
        }
    }
}

public void setAsText(Object value){
    System.out.println("Entered CustomPrimitiveFormat setAsText");
    if (value == null) {
        super.setValue(null);
        return;
    }
    if (value.getClass().equals(String.class)){
        if (StringUtils.isEmpty((String)value)){
            super.setValue(null);
        }
    }
}

} * * тысяча двадцать-один

Я все еще получаю исключение BindingException. Не удалось найти какую-либо ссылку, которая поможет мне преодолеть исключение Spring BindException при добавлении новой записи класса Domain. Мне бы хотелось, чтобы мой первичный ключ оставался примитивным типом вместо использования типа объекта Number.

Заранее спасибо за помощь.

1 Ответ

2 голосов
/ 06 декабря 2010

Как видно из сообщения об ошибке, jqGrid использует _empty в качестве идентификатора новой записи (см. Также здесь ), поэтому вам нужно изменить PropertyEditor для преобразования _emptyдо null.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...