当前位置: 首页 > 知识库问答 >
问题:

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

端木狐若
2023-03-14

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

共有2个答案

祁博雅
2023-03-14

这已在本问题的Micronaut 1.1.1中修复:https://github.com/micronaut-projects/micronaut-core/issues/1599

将此添加到您的应用程序中。yml

jackson:
    property-naming-strategy: SNAKE_CASE

您可以使用以下方式进行测试:

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

        assertThat(applicationContext.getBean(JacksonConfiguration::class.java).propertyNamingStrategy).isEqualTo(PropertyNamingStrategy.SNAKE_CASE)
    }
仲孙宇定
2023-03-14

application.yml

jackson:
    property-naming-strategy: SNAKE_CASE

Micronaut 使用 ObjectMapperFactory 构造 ObjectMapper,该站点不设置属性命名策略(至少在 Micronaut 1.0 GA 版本中,这可能会在将来的版本中发生更改)。您在问题中提到的配置选项不受配置类的支持,因此使用它根本不会执行任何操作。但是,您可以将 ObjectMapperFactory 类替换为您自己的自定义实现,该实现以设置属性命名策略的默认方式构造 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;
        }
    }
}

在此示例中,我将静态类< code > CustomObjectMapperFactory 添加到主< code>Application类中,并使用< code>@Replaces注释来指示Micronaut使用此工厂类和此自定义工厂类提供的< code>objectMapper()方法。我们从该工厂返回的< code>ObjectMapper实例基于它添加的默认工厂方法:

mapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);

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

下面是添加这个自定义工厂类后,我在响应中得到的示例性输出:

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"
}

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

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"
}

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

我们可以使用BeanCreatedEventListener

package com.github.wololock.micronaut;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import io.micronaut.context.event.BeanCreatedEvent;
import io.micronaut.context.event.BeanCreatedEventListener;
import io.micronaut.runtime.Micronaut;

import javax.inject.Singleton;

public class Application {

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

    @Singleton
    static class ObjectMapperBeanEventListener implements BeanCreatedEventListener<ObjectMapper> {

        @Override
        public ObjectMapper onCreated(BeanCreatedEvent<ObjectMapper> event) {
            final ObjectMapper mapper = event.getBean();
            mapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
            return mapper;
        }
    }
}

此解决方案的优点:

    < li >更少的代码行 < li >少了一个抽象层(我们不必担心< code>ObjectMapperFactory,我们只关心配置现有的< code>ObjectMapper bean)。
 类似资料:
  • 我有一个使用以下方法的会话豆: 返回的CalculationResult无法映射到JSON,并出现以下异常: 如何在 Wildfly 中配置杰克逊及其?

  • 问题内容: 我有一个使用以下方法的会话Bean: 返回的CalculationResult无法映射到JSON,并且发生以下异常: 如何在中配置Jackson及其及其? 问题答案: “如何在Wildfly中配置Jackson及其序列化功能?” 你不需要在Wildfly中进行配置,可以在JAX-RS应用程序中进行配置。只需使用即可配置即可(请参阅此处的更多信息)。就像是 如果你还没有Jackson依赖

  • 我试图使用Gson发送JsonObjects作为响应。这些JsonObjects是手工构造的,而不是使用objectMapper或GSON。我排除了所有与杰克逊有关的依赖关系。它工作得很好很好。后来,我尝试使用SpringFox添加Swagger文档。现在它抛出以下异常:

  • 我正在尝试使用Jackson在骆驼路由上序列化POJO和反序列化POJO到JSON和从JSON到JSON。其中一些有Java8 LocalDate字段,我希望它们序列化为YYYY-MM-DD字符串,而不是整数数组。 我们只对Spring Boot应用程序使用Java配置,因此没有XML骆驼配置。 我已经成功地创建了一个ObjectMapper来执行我想要的操作,通过将此添加到我们的依赖项中,我们系

  • 我是Micronaut的新手,我正在尝试将其与现有数据库一起使用。 我有一个带有显式表和列命名的实体,比如 即使我在应用程序中配置了。yml是这样的(以及各种变体,我尝试了各种物理命名策略的值): 我仍然得到这个错误 。 好像我的配置完全被忽略了。 Micronaut代码版本<3.3 我错过什么了吗? 更新 之前: 之后: 只是说,配置是在正确的位置,对的更改是值得的,对的更改显然被忽略了。 实际

  • 我试图在micronaut中创建特定于环境的配置 主要应用。yml as 和本地配置文件,名称为application local。yml 在代码中,我试图以 我在试图访问他们的代码得到以下错误