Spring Roo 2.0.0.RC1 - Поиск даты не работает, и объект не корректно отображается в представлениях поиска

Я создам искатель в Roo для поля даты, но когда запускаю приложение и использую искатель, я получаю BindExceptions.

пример

Я меняю пример клиники

добавить поле дня рождения для питомца

field date --fieldName birthDay --type java.util.Date --notNull --dateTimeFormatPattern "dd.MM.yyyy"

добавить проекцию объекта для питомца

entity projection --class ~.domain.PetInfo --entity ~.domain.Pet --fields id,name,type,birthDay,owner --entityFormatExpression "#{name} (#{type}) - #{owner.lastName} #{owner.lastName} "
repository jpa --entity ~.domain.Pet --interface ~.repository.PetRepository --defaultReturnType ~.domain.PetInfo

удалить искатель для питомца

добавить formbean и найти для любимого дня рождения

dto --class ~.domain.PetBirthdayFormBean
field date --fieldName birthDay --type java.util.Date --dateTimeFormatPattern "dd.MM.yyyy"
find add --entity ~.domain.Pet --name findByBirthDay --formBean ~.domain.PetBirthdayFormBean --returnType ~.domain.PetInfo

и добавить один искатель, который я удаляю с помощью formbean

dto --class ~.domain.PetTypeAndNameLikeFormBean
field string --fieldName name
field enum --fieldName type --type ~.domain.reference.PetType
finder add --entity ~.domain.Pet --name findByTypeAndNameLike --formBean ~.domain.PetTypeAndNameLikeFormBean --returnType ~.domain.PetInfo

когда я запускаю приложение, я получаю исключение

2017-05-11 09:30:45.618  WARN 9476 --- [nio-8092-exec-6] .w.s.m.s.DefaultHandlerExceptionResolver :
Resolved exception caused by Handler execution: org.springframework.validation.BindException: org.sp
ringframework.validation.BeanPropertyBindingResult: 1 errors
Field error in object 'formBean' on field 'birthDay': rejected value [Thu May 11 00:00:00 CEST 2006]
; codes [typeMismatch.formBean.birthDay,typeMismatch.birthDay,typeMismatch.java.util.Date,typeMismat
ch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [formBean.
birthDay,birthDay]; arguments []; default message [birthDay]]; default message [Failed to convert pr
operty value of type [java.lang.String] to required type [java.util.Date] for property 'birthDay'; n
ested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert fro
m type [java.lang.String] to type [@org.springframework.format.annotation.DateTimeFormat java.util.D
ate] for value 'Thu May 11 00:00:00 CEST 2006'; nested exception is java.lang.IllegalArgumentExcepti
on: Invalid format: "Thu May 11 00:00:00 CEST 2006"]

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

см. изображения

Потому что вы думаете, что это не ответ, но я нашел решение для одной проблемы и ответить на него

Почему я не могу ответить на свой вопрос?`

Теперь я отправляю ответ на вопрос, не чистый, я думаю

Поле даты найти не работает, у меня нет решения.

Но проблема с полями дат и другими объектными полями (не строковыми и простыми типами) в представлении поиска я нашел проблему и решение. Та же проблема, что и у https://jira.spring.io/browse/ROO-3907.

обычный пример Contoller PetsCollectionThymeleafController Данные метода:

@GetMapping(produces = Datatables.MEDIA_TYPE, name = "datatables", value = "/dt")
@ResponseBody
public ResponseEntity<ConvertedDatatablesData<Pet>> datatables(DatatablesColumns datatablesColumns, GlobalSearch search, 
    DatatablesPageable pageable, @RequestParam("draw") Integer draw) {
    Page<Pet> pets = getPetService().findAll(search, pageable);
    long totalPetsCount = pets.getTotalElements();
    if (search != null && StringUtils.isNotBlank(search.getText())) {
        totalPetsCount = getPetService().count();
    }
    ConvertedDatatablesData<Pet> datatablesData = new ConvertedDatatablesData<Pet>(pets, totalPetsCount, draw,            
        getConversionService(), datatablesColumns);
    return ResponseEntity.ok(datatablesData);
}

Пример searchController Метод PetsSearchThymeleafController byNameAndWeightDt:

@GetMapping(name = "byNameAndWeightDt", value = "/byNameAndWeight/dt", produces = Datatables.MEDIA_TYPE)
@ResponseBody
public ResponseEntity<DatatablesData<PetInfo>> byNameAndWeightDt(@ModelAttribute("formBean") PetNameAndWeightFormBean 
    formBean, GlobalSearch search, DatatablesPageable pageable, @RequestParam(Datatables.PARAMETER_DRAW) Integer draw) {

    Page<PetInfo> pets = getPetService().findByNameAndWeight(formBean,search,pageable);
    long totalPetsCount = pets.getTotalElements();
    if (search != null && StringUtils.isNotBlank(search.getText())) {
        totalPetsCount = getPetService().countByNameAndWeight(formBean);
    }
    DatatablesData<PetInfo> datatablesData = new DatatablesData<PetInfo>(pets, totalPetsCount, draw);
    return ResponseEntity.ok(datatablesData);
}

В методе datatables возвращаемое значение Type равно responseEntity> и будет установлено с ConvertedDatatablesData datatablesData = new ConvertedDatatablesData (pets, totalPetsCount, draw,
getConversionService (), datatablesColumns);

Для этого у класса PetsCollectionThymeleafController есть атрибут attributeService и метод получения и установки. В конструкторе это поле будет установлено.

private ConversionService conversionService;
...
@Autowired
public PetsCollectionThymeleafController(PetService petService, ConversionService conversionService, MessageSource 
    messageSource, ControllerMethodLinkBuilderFactory linkBuilder) {
    setPetService(petService);
    setConversionService(conversionService);
    setMessageSource(messageSource);
    setItemLink(linkBuilder.of(PetsItemThymeleafController.class));
}
...
public ConversionService getConversionService() {
    return conversionService;
}
public void setConversionService(ConversionService conversionService) {
    this.conversionService = conversionService;
}
...

ConversionService конвертирует элементы в таблицу.

Но методы в SearchControllern не используют ConversionService, поэтому объект типа "Владелец" будет отображаться в списке как [объект объекта], а даты будут отображаться как 1500501600000.

Добавьте ConversionService в SearchContoller и установите в Конструкторе. Измените метод returntype с помощью методов..dt и установите новый параметр DatatablesPageable pageable. В FactoryClass, где by..dt будет вызывать, установите новый нулевой параметр в вызове. Установите элемент возврата

  ConvertedDatatablesData<Pet> datatablesData = new ConvertedDatatablesData<Pet>(pets, totalPetsCount, draw,            
        getConversionService(), datatablesColumns);

Изменения PetsSearchThymeleafController:

...
private ConversionService conversionService;
...
@Autowired
public PetsSearchThymeleafController(PetService petService, ConversionService conversionService, MessageSource 
    messageSource) {
    setPetService(petService);
    setMessageSource(messageSource);
    setConversionService(conversionService);
}
...
public ConversionService getConversionService() {
    return conversionService;
}
public void setConversionService(ConversionService conversionService) {
    this.conversionService = conversionService;
}
...
@GetMapping(name = "byNameAndWeightDt", value = "/byNameAndWeight/dt", produces = Datatables.MEDIA_TYPE)
@ResponseBody
public ResponseEntity<ConvertedDatatablesData<PetInfo>> byNameAndWeightDt(DatatablesColumns datatablesColumns,
    @ModelAttribute("formBean") PetNameAndWeightFormBean formBean, GlobalSearch search, DatatablesPageable 
    pageable, @RequestParam(Datatables.PARAMETER_DRAW) Integer draw) {

    Page<PetInfo> pets = getPetService().findByNameAndWeight(formBean,search,pageable);
    long totalPetsCount = pets.getTotalElements();
    if (search != null && StringUtils.isNotBlank(search.getText())) {
        totalPetsCount = getPetService().countByNameAndWeight(formBean);
    }
    ConvertedDatatablesData<PetInfo> datatablesData = new ConvertedDatatablesData<PetInfo>(pets, totalPetsCount, draw, 
        getConversionService(), datatablesColumns);
    return ResponseEntity.ok(datatablesData);
}
...

до изменений: объекты отображаются некорректно

после смены: Объекты правильно отображаются

1 ответ

Ваша проблема помнит меня на следующий:

https://jira.spring.io/browse/ROO-3887

Мы решили проблему для версии RC1. Однако после анализа вашей проблемы кажется, что у вас возникла та же проблема, что и у зарегистрированной, где эта проблема появилась в таблице результатов поиска:

https://jira.spring.io/browse/ROO-3898

На данный момент нет автоматического решения, но вы можете решить его вручную! Изменить list.html который содержит таблицу результатов поиска и включает в себя дополнительные { применить формат к полям даты.

Увидеть:

data-th-field="${{birthDay}}"

Надеюсь, поможет,

Другие вопросы по тегам