2016-04-09 15 views
6

ho un'entità: metodoKotlin e @Valid Primavera annotazione

class SomeInfo(
     @NotNull @Pattern(regexp = Constraints.EMAIL_REGEX) var value: String) { 
    var id: Long? = null 
} 

e il controller:

@RequestMapping(value = "/some-info", method = RequestMethod.POST) 
public Id create(@Valid @RequestBody SomeInfo someInfo) { 
     ... 
    } 

@Valid annotazione non funziona.

Sembra primavera ha bisogno di un costruttore di default senza parametri e il codice di fantasia sopra diventa a qualcosa di brutto (ma di lavoro) in questo modo:

class SomeInfo() { 

    constructor(value: String) { 
      this.value = value 
     } 

     @NotNull @Pattern(regexp = Constraints.EMAIL_REGEX) 
     lateinit var value: String 

     var id: Long? = null 
    } 

Ogni buona pratica per renderlo meno prolisso?

Grazie.

+0

Stai dicendo che Spring ha bisogno di un costruttore senza parametri ma il codice di lavoro ha ancora un solo costruttore di parametri. – Michael

+0

Sì, hai ragione. Modificato. – user2138356

risposta

17

Sembra che Spring abbia bisogno di queste annotazioni da applicare a un campo. Ma Kotlin applicherà queste annotazioni al parametro costruttore. Utilizzare lo specificatore field: quando si applica un'annotazione per farlo applicare a un campo. Il seguente codice dovrebbe funzionare bene per te.

class SomeInfo(
    @field:NotNull 
    @field:Pattern(regexp = Constraints.EMAIL_REGEX) 
    var value: String 
) { 
    var id: Long? = null 
} 
+0

Stranamente, come ti è venuto in mente? Riflessione sul modello di dati risultante? – Scott

3

In alternativa alla risposta di Michal, anche l'annotazione del getter funziona.

class SomeInfo(
    @get:NotNull 
    @get:Pattern(regexp = Constraints.EMAIL_REGEX) 
    var value: String 
) { 
    var id: Long? = null 
} 

La parte fastidiosa è che non si utilizza @get: o @field: sarà annotare il parametro del costruttore. Questo è ancora un codice kotlin valido (quindi non si ottiene un errore). È solo inutile in questi casi d'uso.

+0

L'ho provato e non ho funzionato. Ho bisogno di qualche configurazione extra o funziona? – ttt

+0

No, dovrebbe funzionare immediatamente. Lo sto usando in un progetto di primavera, quindi ho il pacchetto spring-kotlin che modifica le classi di primavera in modo da essere automaticamente classi "aperte" e "metodi aperti" se sono annotate a molla. Potrebbe essere un effetto sito che fa scalpore. –

Problemi correlati