powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / spring 3 controller: не может принять объект в качестве параметра
15 сообщений из 15, страница 1 из 1
spring 3 controller: не может принять объект в качестве параметра
    #37768427
Фотография аувв
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
привет,

я новичек в спринге (как всегда)

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

я решил сделать объект, в который будет собираться сабмит формы, и потом из этого объекта сделать критерии или нативный sql запрос.

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

Код: java
1.
2.
3.
4.
5.
6.
7.
    @RequestMapping(method = RequestMethod.POST)
    @Transactional
    public void find(DocumentFindCriteria dfc, HttpServletRequest req, 
                     HttpServletResponse resp) throws Exception {
        // это просто строчка чтобы было куда брикпоинт поставить
        DocumentFindCriteria fff = dfc; 
    }



DocumentFindCriteria - это просто pojo, типа такого:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
@XmlRootElement
public class DocumentFindCriteria implements Serializable {

    private static final long serialVersionUID = 1L;
    private int[] year;
    private String number;
    private String archiveNumber;
    private String title;
    private String fullTitle;
    private String comment;
    private String originationDetails;
    private String limitationDetails;
    private Date[] originationDate;
    private Date[] approvalDate;
    private Date[] registrationDate;
    private Date[] placementDate;
    private Date[] updateDate;
    private Integer[] pageCount;
    private Author[] authorCollection;
    private Type[] type;
    private Stage[] stage;
    private Site[] site;
    private Domain domain;
    private Author[] placer;
    private Periodicity[] periodicity;
    private Classification[] classification;

плюс геттеры и сеттеры

запрос POST приходит такой,

title:авпр варап
fullTitle:рап орпа
comment: па ропа орпар опаро апр о
year:1900
year:1902
number:
archiveNumber:
originationDate:04/09/2012
originationDate:04/19/2012
approvalDate:04/15/2012
approvalDate:
registrationDate:04/24/2012
registrationDate:
placementDate:
placementDate:
domain:{"fullName":"New","id":"4","level":"1","name":"New"}
stage:[object Object]
stage:[object Object]
site:[{"id":"107","name":"вавап"}]
classification:[]
limitationDetails:
author:[тратата]
superType:[{"id":"15","name":"Archives"},{"id":"17","name":"Video"}]
type:[{"id":57,"name":"Arj Archive","isMultiFile":"false","superType":{"id":"15","name":"Archives"},"typeExt":[{"ext":{"ext":"arj"},"id":"162","isMain":"false","maxCount":"0","minCount":"0"}]},{"id":58,"name":"AVI Video","isMultiFile":"false","superType":{"id":"17","name":"Video"},"typeExt":[{"ext":{"ext":"avi"},"id":"163","isMain":"false","maxCount":"0","minCount":"0"}]}]
originationDetails:апр апр апр
periodicity:[{"descr":"Daily Update","id":"2","name":"Once A Day"},{"descr":"Monthly Update","id":"4","name":"Once A Month"}]

и т.д.

видно, что спринг пытается это дело засунуть в объект, но у него происходят ошибки типа таких:

Field error in object 'documentFindCriteria' on field 'approvalDate': rejected value [04/15/2012,]; codes [typeMismatch.documentFindCriteria.approvalDate,typeMismatch.approvalDate,typeMismatch.[Ljava.util.Date;,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [documentFindCriteria.approvalDate,approvalDate]; arguments []; default message [approvalDate]]; default message [Failed to convert property value of type 'java.lang.String[]' to required type 'java.util.Date[]' for property 'approvalDate'; nested exception is org.springframework.core.convert.ConversionFailedException: Unable to convert value "" from type 'java.lang.String' to type 'java.util.Date'; nested exception is java.lang.IllegalArgumentException]
Field error in object 'documentFindCriteria' on field 'classification': rejected value [[]]; codes [typeMismatch.documentFindCriteria.classification,typeMismatch.classification,typeMismatch.[Lru.doc.entities.Classification;,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [documentFindCriteria.classification,classification]; arguments []; default message [classification]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'ru.doc.entities.Classification[]' for property 'classification'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [ru.doc.entities.Classification] for property 'classification[0]': no matching editors or conversion strategy found]


этот объект не персистится (не лежит в базе) - из него я буду делать критерии для поиска по базе.

возможно, я вообще все неправильно делаю для реализации формы поиска, но решил попробовать так

может, мне какие-то волшебные аннотации поставить?

в системе есть Jersey, им я буду парсить jsonы. (и еще ExlipceLink)



тут могло быть что угодно! а есть - это.
...
Рейтинг: 0 / 0
spring 3 controller: не может принять объект в качестве параметра
    #37768486
drsm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
аувв, что тут непонятно?
автор[Failed to convert property value of type 'java.lang.String[]' to required type 'java.util.Date[]' for property 'approvalDate'; nested exception is org.springframework.core.convert.ConversionFailedException: Unable to convert value "" from type 'java.lang.String' to type 'java.util.Date'; nested exception is java.lang.IllegalArgumentException]
...
Рейтинг: 0 / 0
spring 3 controller: не может принять объект в качестве параметра
    #37768508
Фотография аувв
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drsmаувв, что тут непонятно?
автор[Failed to convert property value of type 'java.lang.String[]' to required type 'java.util.Date[]' for property 'approvalDate'; nested exception is org.springframework.core.convert.ConversionFailedException: Unable to convert value "" from type 'java.lang.String' to type 'java.util.Date'; nested exception is java.lang.IllegalArgumentException]тут абсолютно все понятно.

не понятно, как этого избежать.

вот раньше она пишет: rejected value [04/15/2012,], то есть она даже сама мне собрала уже строки в массив. теперь надо ей как-то сказать, что это даты в таком-то формате, и да, бывают пустые
...
Рейтинг: 0 / 0
spring 3 controller: не может принять объект в качестве параметра
    #37768528
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблема как раз в вашей форме, которая отправляет пустое значение, для поля Date. Чтобы получить null, нужно не отправлять вообще никакого значения с клиента.
Если исправить на клиенте никакой возможности нет, то можно зарегистрировать конвертер для Spring MVC, чтобы он трактовал пустую строку как NULL:
http://stackoverflow.com/questions/3046451/how-do-i-register-a-custom-conversion-service-in-spring-3-webflow-2
...
Рейтинг: 0 / 0
spring 3 controller: не может принять объект в качестве параметра
    #37768532
vas0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
аувв,

Для всех "непонятных" строк должны быть зарегистированы editor`ы
Код: java
1.
2.
3.
4.
5.
@InitBinder
public void initBinder(WebDataBinder binder) {
   SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
   binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));
}
...
Рейтинг: 0 / 0
spring 3 controller: не может принять объект в качестве параметра
    #37768537
Фотография аувв
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

вот спасибо!

а концептуально я нормально действую или как всегда чешу правой рукой левое ухо, и для поиска вообще все по-другому надо бы делать? :)
...
Рейтинг: 0 / 0
spring 3 controller: не может принять объект в качестве параметра
    #37768555
Фотография аувв
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vas0,

о, тоже здорово, только из примерчика непонятно, как это привязывается именно к моим полям, по типу?

может, мне так надо писать,

Код: java
1.
binder.registerCustomEditor(Date[].class, new Какой-тоИнтерфейс() {а тут я и напишу что хочу});
...
Рейтинг: 0 / 0
spring 3 controller: не может принять объект в качестве параметра
    #37768585
vas0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
аувв,

там есть несколько вариантов с разными сигнатурами. Тебе нужно приходящие строки превратить в объекты твоего типа. Придется написать свои Editor'ы, наследуясь от PropertyEditorSupport. Будет примерно следующее:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
@InitBinder
public void initBinder(WebDataBinder binder) {
   SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
   binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false)); // на класс Date
   binder.registerCustomEditor(Date.class, "originationDate", new CustomDateEditor(dateFormat, false)); // класс Date + поле  
   binder.registerCustomEditor(Author.class, "authorCollection", new AuthorEditor()); // тут придется свои Editor`ы написать
   ...
}
...
Рейтинг: 0 / 0
spring 3 controller: не может принять объект в качестве параметра
    #37768626
Фотография аувв
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vas0,

понял,

мне нужно указывать название поля, иначе по пустой строке оно не догадается, что нужно именно едитор для даты искать... (жалость! могла бы догадаться по типу поля в объекте! эх!)

и именно не массив дат, а просто дата, правильно? ну, я сейчас сам попробую
...
Рейтинг: 0 / 0
spring 3 controller: не может принять объект в качестве параметра
    #37768630
vas0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
аувв,

Нашел небольшой пример . То что у тебя массивы, на это по моему можно не смотреть. Регистрируй редакторы на класс, или на класс + название поля.
...
Рейтинг: 0 / 0
spring 3 controller: не может принять объект в качестве параметра
    #37768921
Фотография аувв
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vas0!

огроменное спасибо.

что с биндерами, что без них одинаково: не ругается, если нет ни одного пустого поля.

иными словами, похоже, биндер для дат зарегистрирован по умолчанию; но момент именно с массивами у них просто не дописан.

перейду, наверно, на наименования полей типа approvalDateFrom и approvalDateTo, думаю, сработает.

спасибо еще раз

ф
...
Рейтинг: 0 / 0
spring 3 controller: не может принять объект в качестве параметра
    #37768926
drsm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ауввdrsmаувв, что тут непонятно?
пропущено...
тут абсолютно все понятно.

не понятно, как этого избежать.

вот раньше она пишет: rejected value [04/15/2012,], то есть она даже сама мне собрала уже строки в массив. теперь надо ей как-то сказать, что это даты в таком-то формате, и да, бывают пустые
я такие ужасы, как у тебя, со стороны extjs передаю постом не как форму, а сразу готовый json.
потом это получается как-то так:
Код: java
1.
2.
3.
@RequestMapping(value = "core/report", method = RequestMethod.POST)
public ModelAndView attack(@RequestBody ReportRequest req, Principal principal) {
}


Json десериализируется jackson'ом, менее адово выглядит чем проперти эдиторы.
...
Рейтинг: 0 / 0
spring 3 controller: не может принять объект в качестве параметра
    #37768931
Фотография аувв
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может, сказал фигню (без указания формата даты в биндере какая может быть нормальная работа), но с массивами точно бяка
...
Рейтинг: 0 / 0
spring 3 controller: не может принять объект в качестве параметра
    #37768948
Фотография аувв
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drsmя такие ужасы, как у тебя, со стороны extjs передаю постом не как форму, а сразу готовый json.ща еще раз это попробую, у меня сразу не получилось
...
Рейтинг: 0 / 0
spring 3 controller: не может принять объект в качестве параметра
    #37769075
Фотография аувв
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ауввdrsmя такие ужасы, как у тебя, со стороны extjs передаю постом не как форму, а сразу готовый json.ща еще раз это попробую, у меня сразу не получилосьхотел отрапортовать об удаче, ан нет

org.codehaus.jackson.map.JsonMappingException: Can not construct instance of java.util.Date from String value '04/10/2012': not a valid representation (error: Can not parse date "04/10/2012": not compatible with any of standard forms ("yyyy-MM-dd'T'HH:mm:ss.SSSZ", "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", "EEE, dd MMM yyyy HH:mm:ss zzz", "yyyy-MM-dd"))

оставлю на завтра :(

всем спасибо
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / spring 3 controller: не может принять объект в качестве параметра
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]