如何配置 Jackson 在 Micronaut 中使用 SNAKE_CASE?

Bru*_*rin 6 jackson micronaut

我尝试在使用 Micronaut 时使用 SNAKE_CASE 将 jackson 配置为接受 JSON,但是,它无法识别该属性jackson.property-naming-strategy: SNAKE_CASE

Szy*_*iak 9

从 Micronaut 1.1.1

应用程序.yml

jackson:
    property-naming-strategy: SNAKE_CASE
Run Code Online (Sandbox Code Playgroud)

在 Micronaut 1.1.1 之前

Micronaut 构造ObjectMapper使用ObjectMapperFactory它不会设置属性命名策略(至少在 Micronaut 1.0 GA 版本中,这可能会在未来版本中更改)。配置类不支持您在问题中提到的配置选项,因此使用它根本不起作用。但是,您可以ObjectMapperFactory用您自己的自定义实现替换class,该实现ObjectMapper以默认方式构建+ 它设置属性命名策略。考虑以下示例:

jackson:
    property-naming-strategy: SNAKE_CASE
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我CustomObjectMapperFactory在主Application类中添加了一个静态类,并使用@Replaces注解来指示 Micronaut 使用objectMapper()这个自定义工厂类提供的这个工厂类和方法。ObjectMapper我们从这个工厂返回的实例是基于默认的工厂方法+它添加的:

package com.github.wololock.micronaut;

import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import io.micronaut.context.annotation.Factory;
import io.micronaut.context.annotation.Replaces;
import io.micronaut.jackson.JacksonConfiguration;
import io.micronaut.jackson.ObjectMapperFactory;
import io.micronaut.runtime.Micronaut;

import javax.inject.Singleton;
import java.util.Optional;

public class Application {

    public static void main(String[] args) {
        Micronaut.run(Application.class);
    }

    @Factory
    @Replaces(ObjectMapperFactory.class)
    static class CustomObjectMapperFactory extends ObjectMapperFactory {

        @Override
        @Singleton
        @Replaces(ObjectMapper.class)
        public ObjectMapper objectMapper(Optional<JacksonConfiguration> jacksonConfiguration, Optional<JsonFactory> jsonFactory) {
            final ObjectMapper mapper = super.objectMapper(jacksonConfiguration, jsonFactory);
            mapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
            return mapper;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

设置预期的属性命名策略。

这是添加此自定义工厂类后我在响应中返回的示例性输出:

mapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
Run Code Online (Sandbox Code Playgroud)

默认情况下(没有这个自定义工厂类)响应如下所示:

HTTP/1.1 200 OK
Date: Wed, 7 Nov 2018 19:15:10 GMT
connection: keep-alive
content-length: 38
content-type: application/json

{
    "first_name": "Joe",
    "last_name": "Doe"
}
Run Code Online (Sandbox Code Playgroud)

更新:BeanCreatedEventListener<ObjectMapper>改为使用

有一种替代方法可以实现相同的效果,只需更少的代码行。学分转到Micronaut Framework Twitter 帐户:)

我们可以使用BeanCreatedEventListener<T>它来响应 bean 创建事件,并允许我们扩展刚刚创建的 bean。在这种情况下,它意味着添加一个实现BeanCreatedEventListener<ObjectMapper>和设置属性命名策略的类:

HTTP/1.1 200 OK
Date: Wed, 7 Nov 2018 19:04:14 GMT
connection: keep-alive
content-length: 36
content-type: application/json

{
    "firstName": "Joe",
    "lastName": "Doe"
}
Run Code Online (Sandbox Code Playgroud)

该解决方案的优点:

  • 更少的代码行
  • 少一个抽象层(我们不必费心ObjectMapperFactory,我们只关心配置现有的ObjectMapperbean)。


hma*_*tt1 7

从 Micronaut 1.1.1 开始,此问题已修复:https : //github.com/micronaut-projects/micronaut-core/issues/1599

将此添加到您的application.yml

jackson:
    property-naming-strategy: SNAKE_CASE
Run Code Online (Sandbox Code Playgroud)

您可以使用以下方法对其进行测试:

    @Test
    fun testJackson() {
        val applicationContext = ApplicationContext.run()

        assertThat(applicationContext.getBean(JacksonConfiguration::class.java).propertyNamingStrategy).isEqualTo(PropertyNamingStrategy.SNAKE_CASE)
    }
Run Code Online (Sandbox Code Playgroud)