gpt4 book ai didi

java - typeMismatch.java.util.List 尝试设置列表时

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:42:53 26 4
gpt4 key购买 nike

我正在尝试设置 List<Long>到 Java 对象。

设置函数为:

ResponseEntity<String> response = bcInsertService.addNewClip(new PrmBcClipInsert()
.setTags(Arrays.asList(new Long[]{5L, 3L}))
);

对象是

public class PrmBcClipInsert implements Serializable {

@ApiModelProperty(required = true)
private List<Long> tags;

public List<Long> getTags() {
return tags;
}

public PrmBcClipInsert setTags(List<Long> tags) {
this.tags = tags;
return this;
}
}

这是 BcInsertService:

public class BcInsertService extends RestTemplate {
private static final Logger log = LoggerFactory.getLogger(BcInsertService.class);

public ResponseEntity<String> addNewClip(PrmBcClipInsert prmBcClipInsert) {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
MultiValueMap<String, Object> map= new LinkedMultiValueMap<String, Object>();
HttpEntity<MultiValueMap<String, Object>> request = new HttpEntity<MultiValueMap<String, Object>>(prmBcClipInsert.getParameters(), headers);

ParameterizedTypeReference<StandardResponse> typeRef = new ParameterizedTypeReference<StandardResponse>() {};
ResponseEntity<String> response = this.postForEntity( "http://localhost:8080/bc/add-clip", request , String.class );
log.info(response.toString());
return response;
}

}

它返回一个错误:

Field error in object 'prmBcClipInsert' on field 'tags': rejected value [[5,3]]; codes [typeMismatch.prmBcClipInsert.tags,typeMismatch.tags,typeMismatch.java.util.List,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [prmBcClipInsert.tags,tags]; arguments []; default message [tags]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.util.List' for property 'tags'; nested exception is java.lang.NumberFormatException: For input string: "[5,3]"]

为什么该方法不接受列表,即使它说它接受列表?

最佳答案

我能够使用表单验证重新创建您的错误案例。您可能试图传递 [5, 3] 的表单数据对于 tags类型为 List<Long> 的变量, 但用括号传递会破坏该结构,该值应为 5, 3 ...

所以我所做的是;

  1. 使用您的输入创建一个虚拟 Controller ;

    @Controller
    public class TestController {

    @PostMapping
    public ModelAndView test(@Validated @ModelAttribute final PrmBcClipInsert prmBcClipInsert, final BindingResult bindingResult) {
    final ModelAndView modelAndView = new ModelAndView();
    System.out.println(prmBcClipInsert.getTags());
    modelAndView.setViewName("test");
    return modelAndView;
    }
    }
  2. 使用 tags=[5,3] 传递表单, 并在 BindingResult 中得到以下错误;

    org.springframework.validation.BeanPropertyBindingResult: 1 errors Field error in object 'prmBcClipInsert' on field 'tags': rejected value [[5, 3]]; codes [typeMismatch.prmBcClipInsert.tags,typeMismatch.tags,typeMismatch.java.util.List,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [prmBcClipInsert.tags,tags]; arguments []; default message [tags]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.util.List' for property 'tags'; nested exception is java.lang.NumberFormatException: For input string: "[5,3]"]

    这与您遇到的错误相同...所以我想您要么得到了这个 PrmBcClipInsert作为我示例中的表单输入,或者您正在尝试在代码的其他部分进行类似的绑定(bind)...

  3. 使用 tags=5,3 传递表单, 没有错误...


可以有一个自定义转换器来支持在绑定(bind)逻辑中传递带括号的数组输入,例如;

@Component
public class LongListConverter implements Converter<String, List<Long>> {

@Override
public List<Long> convert(String source) {
return Arrays.stream(StringUtils.strip(source, "[]").split(","))
.map(StringUtils::strip)
.map(Long::new)
.collect(Collectors.toList());
}
}

有了这个,5, 3 & [5, 3]可以作为 tags 的值提供变量。

关于java - typeMismatch.java.util.List 尝试设置列表时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56911978/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com