Estoy tratando de establecer una List<Long>
a un objeto Java.
La función de conjunto es:
ResponseEntity<String> response = bcInsertService.addNewClip(new PrmBcClipInsert()
.setTags(Arrays.asList(new Long[]{5L, 3L}))
);
Y el objeto es
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;
}
}
Esta es 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;
}
}
Y se devuelve un error:
error de campo en el objeto 'prmBcClipInsert' en el campo 'etiquetas': valor rechazada [[5,3]]; códigos [typeMismatch.prmBcClipInsert.tags, typeMismatch.tags, typeMismatch.java.util.List, typeMismatch]; Argumentos [org.springframework.context.support.DefaultMessageSourceResolvable: códigos [prmBcClipInsert.tags, etiquetas]; argumentos []; mensaje predeterminado [tag]]; mensaje predeterminado [Error al valor de la propiedad de convertir del tipo 'java.lang.String' al tipo requerido 'java.util.List' para la propiedad 'etiquetas'; excepción anidada es java.lang.NumberFormatException: Para cadena de entrada: "[5,3]"]
¿Por qué el método no acepta una lista a pesar de que se dice que acepta una lista?
Yo era capaz de recrear su caso de error utilizando una validación de formularios. Usted está probablemente tratando de pasar una plantilla que es [5, 3]
para la tags
variable tipo List<Long>
, pero que pasa con los soportes de romper esa estructura, el valor debe ser 5, 3
...
Así que lo que he hecho es;
Crear un controlador simulado utilizando su entrada;
@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; } }
Pasar el formulario con
tags=[5,3]
, y obtener el error siguiente enBindingResult
;org.springframework.validation.BeanPropertyBindingResult: 1 errores error de campo en el objeto 'prmBcClipInsert' en el campo 'etiquetas': valor rechazado [[5, 3]]; códigos [typeMismatch.prmBcClipInsert.tags, typeMismatch.tags, typeMismatch.java.util.List, typeMismatch]; Argumentos [org.springframework.context.support.DefaultMessageSourceResolvable: códigos [prmBcClipInsert.tags, etiquetas]; argumentos []; mensaje predeterminado [tag]]; mensaje predeterminado [Error al valor de la propiedad de convertir del tipo 'java.lang.String' al tipo requerido 'java.util.List' para la propiedad 'etiquetas'; excepción anidada es java.lang.NumberFormatException: Para cadena de entrada: "[5,3]"]
¿Cuál es el error idéntica, que estaba recibiendo ... Así que supongo que tampoco recibe este
PrmBcClipInsert
como un formulario de entrada como en mi ejemplo, o que está tratando de hacer una unión en alguna otra parte de su código similar ...Pasar el formulario con
tags=5,3
, ningún error ...
No puede haber un convertidor de medida para el apoyo para el paso de dicho array entrada con soportes en la lógica de unión con algo parecido;
@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());
}
}
Con esto, tanto 5, 3
y [5, 3]
se puede suministrar como valor de la tags
variable.