Bota Kotlin-Primavera: Gotchas

Gokul Chandrasekaran Blocked Unblock Seguir Seguindo 6 de janeiro

Faz cerca de 6 meses desde que adotamos o Kotlin para nossos serviços de back-end na empresa em que trabalho atualmente. Estamos migrando um serviço de inicialização de mola java existente para o Kotlin.

Nossa experiência com Kotlin tem sido ótima. Mas às vezes parece que a Primavera foi adaptada para suportar o Kotlin. Há os problemas básicos como:

  1. Spring requer classes com anotações para serem abertas, todas as classes no Kotlin são fechadas por padrão. Isso pode ser resolvido adicionando o plugin kotlin-spring à configuração gradle.
  2. Entidades do Hibernate requerem um construtor no-arg, o Kotlin forneceu um plugin do compilador kotlin-jpa para gerar um construtor adicional de zero-argumentos para classes.

É importante observar que esses problemas foram identificados e o projeto é gerado usando o start.spring.io para que esses plug-ins sejam incorporados à sua configuração. Mais detalhes sobre isso na seção Further Reading.

Validação Spring DTO @NotNull

Vamos usar um DTO simples para representar um corpo de solicitação HTTP usado para criar uma pessoa, onde esperamos que o name e a age não sejam nulos . Usamos javax 's @NotNull anotação para validar os campos de solicitação, que definimos a não ser anulável.

Para o pedido abaixo:

 { 
"idade": 20,
"description": "pessoa sem nome"
}

Esperamos um erro de validação no campo de name , no entanto, ele passa os validadores especificados no DTO.

Por quê?

O validador javax requer uma instância do objeto antes de poder validá-lo. Como o campo é declarado como não anulável, o jackson-module-kotlin está fornecendo um valor padrão para o campo com base em seu tipo. No caso do name(String) ele define uma string vazia ou 0 no caso de age(Int) .

Soluções alternativas possíveis

  1. Com base no seu caso de uso, considere a possibilidade de o valor ser o valor padrão na validação. (isto é, validar contra possíveis inadimplências.

Isso garante que o campo de nome tenha pelo menos um caractere e falha na validação de sequências vazias. Da mesma forma, para a idade, pode ser especificado ter pelo menos um valor de 1.

2. Habilitar o DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES para jackson-module-kotlin poderia ajudar lançando erros durante a construção do objeto durante a desserialização. Estes são diferentes dos erros de validação e devem ser tratados de acordo.

IMHO a abordagem anterior é preferível porque, além do fato de ainda lançar um erro de validação, permite especificar condições mais expressivas para validação, tornando-a mais legível.

Primavera não tem suporte para Coroutines

Coroutines foram feitas estáveis no lançamento do Kotlin versão 1.3. No entanto, eles ainda não são suportados pelo Spring fora da caixa.

Por quê?

Despachantes do Spring framework não suportam construções geradas pelo compilador Kotlin para Coroutines . O compilador Kotlin gera um parâmetro Continuation para funções suspended , para o qual o Spring não possui manipuladores integrados.

Soluções possíveis

Graças aos esforços de Konrad , Coroutines pode ser usado na Primavera, usando o spring-kotlin-coroutine . A biblioteca fornece módulos para suportar Coroutines para diferentes aplicativos / domínios no Spring.

Ou apenas aproveite os executores do @Async que saem da caixa com o Spring.

A Spring está trabalhando em ter mais suporte nativo para Coroutines. Seu status é rastreado aqui. https://jira.spring.io/browse/SPR-15413