Conseguir un valor nulo en el PathVariable

votos
1

Yo M cuya problemas para asignar el valor de thymleaf formulario para pathvariable en mi controlador dentro de la primavera .

La forma del archivo de índice:

      <!--/*@thymesVar id=fiatCurrency type=java.lang.String*/-->
            <form 
              th:action=@{'/values/' + ${fiatCurrency}}  method=post  >
              <select name=fiatCurrency onchange=this.form.submit()>
                    <option   th:value=USD th:text=USD> </option>
                    <option  th:value=EUR th:text=EUR> </option>
                    <option   th:value=CNY th:text=CNY> </option>
              </select>
            </form>

El controlador es el siguiente:

@Controller
public class DataController {

  private  ApiService apiService;

public DataController(ApiService apiService) {
    this.apiService = apiService;
}

@GetMapping(value = {/values,/values/,, /, /index,/cryptos} )
public String index(Model model){

    model.addAttribute(cryptos,apiService.getCrypto(100));

    return index;
}

@PostMapping(value = /values/{fiatCurrency})
public String choseCurrency(Model model,@PathVariable String fiatCurrency){

    model.addAttribute(cryptos,apiService.getInDifferentValues(fiatCurrency));


    return index;
}
}

Mi problema es que siempre devuelve el valor nulo y yo estoy luchando cómo enlazar dentro de los PathVariable fiatCurrencyvalores CNY , EUR o USD forman el index.htmlformulario.

Publicado el 20/10/2018 a las 10:33
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
1

La cosa es que usted está tratando de cambiar dinámicamente el atributo de acción del formulario, después de que la página se hizo. Esto no se puede hacer usando thymeleaf, al menos, la forma en que están tratando. Recuerde que thymeleaf funciona del lado del servidor. Por lo tanto, usted tiene dos opciones para lograr esto.

  • En lugar de utilizar una variable de ruta, utilizar un parámetro en su lugar.
  • cambiar dinámicamente la acción del formulario utilizando js.

La forma más fácil sería, por supuesto, ser la primera opción. Por lo tanto, lo que se necesita para cambiar el mapeo de correos en su controlador y cambiar la variable de ruta para un parámetro.

Cambiar su método de control para el siguiente.

@PostMapping(value = "/values/fiatCurrency")
public String choseCurrency(Model model,
                            @RequestParam("fiatCurrency") String fiatCurrency) {
    model.addAttribute("cryptos", apiService.getInDifferentValues(fiatCurrency));
    return "index";
}

Y su html terminaría con este aspecto.

<form id="fiatForm" th:action="@{/values/fiatCurrency}"  method="post">
   <select id="fiatSelect" name="fiatCurrency">
       <option th:value="USD" th:text="USD"> </option>
       <option th:value="EUR" th:text="EUR"> </option>
       <option th:value="CNY" th:text="CNY"> </option>
   </select>
</form>

Si no desea añadir un botón para enviar el formulario, a continuación, añadir esta jQueryfunción hará el truco.

$("#fiatSelect").on("change", function() {
   $("#fiatForm").submit();
})

He probado este código y ya se está trabajando. Espero eso ayude.

Respondida el 20/10/2018 a las 11:44
fuente por usuario

votos
0

La respuesta de mi caso fue que me cambió la PathVaribale a RequestBody y que funcione. Probé también para cambiarlo a RequestParam @ Alain-cruz pero me dio el error de arriba que he mencionado.

No pasó por cierto tuvo que cortar un poco de la variable que estaba recibiendo causa que tengo es @RequestBody String="fiatCurrency=EURpor lo que tenía que deshacerse en fiatCurrency =.

Aclamaciones

Respondida el 20/10/2018 a las 12:06
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more