TransWikia.com

Problema de formulario con thymeleaf. Failed to convert value of type 'java.lang.String' to required type 'java.lang.Long';

Stack Overflow en español Asked by SirNoob on November 13, 2021

Hola estoy empezando con spring boot llevo talvees unas 3 semanas y tengo problemas con el fromulario para acualizar registros de modulos cuando doy al boton update me salta este error en el navegador:

There was an unexpected error (type=Bad Request, status=400).
Failed to convert value of type ‘java.lang.String’ to required type ‘java.lang.Long’; nested exception is java.lang.NumberFormatException: For input string: "updateModule"

En la consola me muestra esta excepcion:

org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type ‘java.lang.String’ to required type ‘java.lang.Long’; nested exception is java.lang.NumberFormatException: For input string: "updateModule"

El problema esta con la id ya probe con la duracion como INTEGER y muestra el mismo error, no puede parsear de String a Long. uso el id para comparar que el registro ingresado no sea igual al de la base de datos y devolver la info al formulario y mostrar un mensaje de que no se cambio nada.

Probe sin el BindignResult y el @Valid no paso nada.

La opcion mas sencilla seria no comparar el id y quitarlo de la operacion pero esto es copia y pega de otra entidad en la que todo me funciona todo perfecto la unica diferencia es que la otra entidad tiene mas atributos y en Module solo adapte para poder usar el metodo con esta entidad

Me asegure de que todo este "bien" pero no deja de aparecer ese error de parse, tengo metodos de borrar y buscar que usan el id y ningun me muestra esto.

Arranque la app con el debugger pero no pasa nada con los break points porque no entra al metodo de update, no se si hay otra herramienta con la que puedo ver que pasa.

El th:formmethod="PUT" del boton lo puse porque si dejo el verbo como POST el navegador me muestra este error me asegure muchas veces que los verbos coinciden pero nada el navegador siempre muestra esto:

There was an unexpected error (type=Method Not Allowed, status=405).
Request method ‘POST’ not supported

Y en la consola esta excepcion:

org.springframework.web.HttpRequestMethodNotSupportedException: Request method ‘POST’ not supported

Esto no me importa porque si no me muestra el error de verbo no soportado es porque debe encontrar al metodo en el controlador. O no?

***Entidad Module exclui su relacion manytomany del el tostring para evitar la llamadas infinitas cuando muestro a module en student esta igual y el equal para no comparar al momento de actualizar.

@Entity
@Table(name = "modules")
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Data
public class Module {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @NotEmpty(message = "The name is required")
    @Size(min = 3, max = 25, message = "The name must be between 3 and 25 characters!")
    @Column(unique = true, nullable = false, length = 25)
    private String name;
    private String status;

    @Digits(integer = 3, fraction = 0, message = "The duration can only be 3 digits!")
    @NotNull(message = "The duration is required!")
    @Positive(message = "The duration must be positive and greater than zero!")
    @Column(nullable = false)
    private Long duration;

    @EqualsAndHashCode.Exclude
    @ToString.Exclude
    @ManyToMany(cascade = CascadeType.REMOVE, mappedBy = "modules")
    @JsonIgnoreProperties("modules")
    private List<Student> students;
}

***Metodo update en el controlador

@Slf4j
@Controller
@RequestMapping(value = "/modules/")
public class ModuleViewController {.......


@PutMapping(value = "updateModule")
public ModelAndView updateModule(@Valid Module module, BindingResult bindingResult) {
    ModelAndView mv = new ModelAndView();
    
    if (bindingResult.hasErrors()) {
        log.debug("Errores {}", bindingResult);
        mv.addObject("message", "Invalid data!");
        mv.addObject("disableSave", true);
        mv.setViewName("ModuleForm");
        return mv;
    }

    String message = moduleService.checkUpdate(module);
    mv.addObject("message", message);

    if (!message.equals("")) {
        mv.addObject("module", module);
        mv.addObject("disableSave", true);
        mv.setViewName("ModuleForm");
        return mv;
    }

    Module moduleDB = moduleService.updateModule(module);
    message = "Module successfully updated!";
    String classAppend = "alert-success";

    mv.addObject("classAppend", classAppend);
    mv.addObject("message", message);
    mv.addObject("module", moduleDB);
    mv.setViewName("ShowStudent");
    return mv;
}

***Formulario con thymeleaf uso este mismo fomrulario para crear registros pero no creo que esto tenga que ver con el problema, como ya dije antes ya tengo la otra entidad "Student" con la que todo esto funciona.

<form th:action="@{createModule}" th:object="${module}"
                method="POST">
                <div class="card">
                    <div class="card-header">
                        <h3>ADD MODULE</h3>
                    </div>
                    <div class="card-body">

                        <div class="form-group">
                            <label for="">ID</label> <input class="form-control" type="text" th:field="*{id}"
                                th:readonly="${disableSave == true}" />
                        </div>

                        <div class="form-group">
                            <label for="">NAME</label> <input th:field="*{name}" type="text"
                                class="form-control" th:name="name" />
                        </div>

                        <div class="form-group">
                            <label for="">DURATION</label> <input pattern="[0-9]{1,3}"
                                title="Only numbers are allowed." th:field="*{duration}"
                                type="text" class="form-control" />
                        </div>

                        <input type="hidden" th:field="*{status}" />

                    </div>
                    <div class="card-footer">
                        <button type="submit" class="btn btn-success"
                            th:disabled="${disableSave == true}">Save</button>

                        <button type="submit" class="btn btn-warning"
                            th:disabled="${disableUpdate == true}" th:formmethod="PUT"
                            th:formaction="@{updateModule}">Update</button>
                    </div>
                </div>

            </form>

No se que estoy haciendo mal, No se que es lo que pasa si es thymeleaf o es de http o mi controller asi que no se como investigar.

Este es el repo de gihub por si quieren ver mas de lo que llevo vean la rama notacionConverter, se llama asi porque quise hacer algo que al final no me gusto y me quede ahi para no romper mas a master.

https://github.com/SirNoob97/School.git

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP