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}}"
Надеюсь, поможет,