Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    [Kotlin] Spring boot path e variabili

    ciao!

    ho un problemino con i path e le variabili da passare nell'url.
    questo il controller:
    codice:
    package com.mp.springkotlin
    
    import org.springframework.web.bind.annotation.RequestMapping
    import org.springframework.web.bind.annotation.RequestParam
    import org.springframework.web.bind.annotation.RestController
    import java.util.concurrent.atomic.AtomicLong
    
    @RestController
    class GreetingController {
        val counter = AtomicLong();
    
        @RequestMapping("/greeting/{name}")
        fun greeting(@RequestParam(value = "name", defaultValue = "Nothing") name: String): Greeting {
            return Greeting(counter.incrementAndGet(), String.format("%s", name));
        }
    }
    quando vado su http://localhost:8080/greeting/GGG vedo sempre Nothing.
    in sostanza non si prende il valore passato.

    questa la data class:
    codice:
    package com.mp.springkotlin
    
    data class Greeting(val id: Long, val value: String)

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da fermat Visualizza il messaggio
    codice:
        @RequestMapping("/greeting/{name}")
        fun greeting(@RequestParam(value = "name", defaultValue = "Nothing") name: String): Greeting {
    @RequestParam si usa per estrarre i query parameters (o form data se da POST) che sono quelli nel url tipo bla/bla?name=Xyz&xxx=yyy&.....

    Quello che hai specificato tu con /greeting/{name} è un "path" parameter e si prende con @PathVariable (nota: NON ha l'attributo defaultValue )

    Quindi anche qui non c'entra Kotlin ... c'entra la conoscenza di HTTP e del framework.
    Ultima modifica di andbin; 18-04-2020 a 11:13
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    ciao!

    si, anche qui immaginavo non dipendesse da kotlin.
    lo specifico come da regolamento.

    cmq ho modificato così e funziona:
    codice:
    import org.springframework.web.bind.annotation.*
    import java.util.concurrent.atomic.AtomicLong
    
    @RestController
    class GreetingController {
        val counter = AtomicLong();
    
        @GetMapping("/greeting/{name}")
        fun greeting(@PathVariable(value = "name") name: String): Greeting {
            return Greeting(counter.incrementAndGet(), String.format("%s", name));
        }
    }
    grazie!

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    E se vuoi che sia opzionale, devi mettere la doppia specifica in @GetMapping cioè "/greeting/{name}" e anche "/greeting" (non so come si esprime in Kotlin) e poi mettere required=false nel @PathVariable.
    A quel punto hai o una stringa non-null oppure null. In alternativa al null puoi anche ricevere un Optional<String>

    P.S. in Java si mette @GetMapping({"/greeting/{name}", "/greeting"})
    In Kotlin sarà forse uguale o similare ...
    Ultima modifica di andbin; 18-04-2020 a 12:01
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    ok visto che ci siamo ho provato.

    allora, in kotlin questo da errore in compilazione:
    codice:
    @GetMapping({"/greeting/{name}", "/greeting"})
    fun greeting(@PathVariable(value = "name", required = false) name: String): Greeting {
        return Greeting(counter.incrementAndGet(), String.format("%s", name));
    }
    non ho ancora capito come risolverlo:
    codice:
    [ERROR] Failed to execute goal org.jetbrains.kotlin:kotlin-maven-plugin:1.3.71:compile (compile) on project spring-kotlin: Compilation failure
    [ERROR] /home/matte-server/Documenti/spring-kotlin/src/main/kotlin/com/mp/springkotlin/GreetingController.kt:[10,36] Unexpected tokens (use ';' to separate expressions on the same line)
    ho provato ad usare ;, ma ovviamente non è corretto.

    se faccio così:
    codice:
    @GetMapping("/greeting/{name}")
    fun greeting(@PathVariable(value = "name", required = false) name: String): Greeting {
        return Greeting(counter.incrementAndGet(), String.format("%s", name));
    }
    e vado su http://localhost:8080/greeting/, ottengo questo:
    codice:
    Whitelabel Error PageThis application has no explicit mapping for /error, so you are seeing this as a fallback.
    Sat Apr 18 14:42:30 CEST 2020
    There was an unexpected error (type=Not Found, status=404).
    No message available

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da fermat Visualizza il messaggio
    codice:
    @GetMapping({"/greeting/{name}", "/greeting"})
    fun greeting(@PathVariable(value = "name", required = false) name: String): Greeting {
    Evidentemente la sintassi NON è quella (io te l'ho detta per Java).

    Da una veloce lettura della documentazione ufficiale: https://kotlinlang.org/docs/referenc...va-annotations

    If the value argument in Java has an array type, it becomes a vararg parameter in Kotlin:

    Quindi dovrebbe essere semplicemente senza { } per l'array (che invece in Java servono se ci sono più elementi)

    codice:
    @GetMapping("/greeting/{name}", "/greeting")
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    in verità avevo provato così come dici:
    codice:
    @GetMapping("/greeting/{name}", "/greeting")
    fun greeting(@PathVariable(value = "name", required = false) name: String): Greeting {
        return Greeting(counter.incrementAndGet(), String.format("%s", name));
    }
    ma se poi vado su http://localhost:8080/greeting/ ottengo cmq questo:
    codice:
    Whitelabel Error PageThis application has no explicit mapping for /error, so you are seeing this as a fallback.
    Sat Apr 18 18:40:32 CEST 2020
    There was an unexpected error (type=Internal Server Error, status=500).
    Parameter specified as non-null is null: method com.mp.springkotlin.GreetingController.greeting, parameter name
    mentre in console vedo questo:
    codice:
    ERROR 23183 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.IllegalArgumentException: Parameter specified as non-null is null: method com.mp.springkotlin.GreetingController.greeting, parameter name] with root cause
    
    java.lang.IllegalArgumentException: Parameter specified as non-null is null: method com.mp.springkotlin.GreetingController.greeting, parameter name
    quindi pensavo di aver sbagliato.

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da fermat Visualizza il messaggio
    java.lang.IllegalArgumentException: Parameter specified as non-null is null

    quindi pensavo di aver sbagliato.
    Ah già .... ora mi ricordo! (avevo studiato qualcosa di Kotlin qualche anno fa). Un obiettivo di Kotlin è di evitare il più possibile le questioni con il null e quindi il NullPointerException. Per cui a livello proprio di type-system distingue bene tra i tipi che devono poter trattare un null e quelli che non devono trattarlo.
    Quindi solo String è NON-nullable. Se lo vuoi nullable devi mettere String?

    (il @GetMapping è invece sicuramente giusto)

    Pertanto:

    fun greeting(@PathVariable(value = "name", required = false) name: String?): Greeting {


    P.S. scusa la domanda ma stai usando Kotlin+Spring Boot per quale motivo? Mi pare che non conosci bene né l'uno né l'altro.
    Ultima modifica di andbin; 18-04-2020 a 19:10
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    in generale spring+kotlin in modo da riprendere un pò kotlin, che avevo studiato un pò un anno fa, e studiare un pò spring.
    giusto per conoscenza generale, non devo fare nessun lavoro specifico.

    per il discorso dei valori non-nullable mi ero scordato.
    in effetti mi dovrei rivedere un pò le cose base di kotlin.
    cmq domani provo e vediamo che esce fuori!

  10. #10
    ok così funziona:
    codice:
    @GetMapping("/greeting/{name}", "/greeting")
    fun greeting(@PathVariable(value = "name", required = false) name: String?): Greeting {
        return Greeting(counter.incrementAndGet(), String.format("%s", name));
    }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.