【问题标题】:Spring Roo 2.0.0.RC1 - Date finder don't work and Object not correct displayed in finder viewsSpring Roo 2.0.0.RC1 - 日期查找器不起作用并且对象不正确显示在查找器视图中
【发布时间】: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);
}
...

更改前:

更改后a:

【问题讨论】:

  • 能否在控制器.aj文件中提供生成的finder的代码?

标签: spring-roo


【解决方案1】:

你的问题让我想起了以下一个:

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

我们已经解决了 RC1 版本的问题。但是,在分析您的问题后,您似乎遇到了与此问题出现在查找器结果表中的已注册问题相同的问题:

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

目前还没有自动解决方案,但您可以手动解决!编辑包含查找器结果表的list.html 并包含额外的{ 以将格式应用于日期字段。

见:

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

希望对你有帮助,

【讨论】:

  • 为什么我的答案被删除了????我描述了一个问题的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 2016-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-29
  • 1970-01-01
相关资源
最近更新 更多