【发布时间】:2017-05-11 07:47:37
【问题描述】:
我将在 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);
}
在方法数据表中返回类型为 responseEntity> 并将设置为 ConvertedDatatablesData datatablesData = new ConvertedDatatablesData(pets, totalPetsCount, draw,
getConversionService(), datatablesColumns);
PetsCollectionThymeleafController 类有属性conversionService 以及getter 和setter 方法。在 construktor 中会设置这个字段。
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,因此像 Owner 这样的 Object 将在 List 中显示为 [object Object],而 Dates 将显示为 1500501600000。
将 ConversionService 添加到 SearchContoller 并在构造函数中设置。 通过..dt 方法更改返回类型并设置新参数 DatatablesPageable 可分页。在 FactoryClass 中,by..dt 将在调用中调用 set new null 参数。 设置返回元素
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);
}
...
【问题讨论】:
-
能否在控制器.aj文件中提供生成的finder的代码?
标签: spring-roo