gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 16:06:42 27 4
gpt4 key购买 nike

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

最佳答案

来自 Micronaut 1.1.1

application.yml

jackson:
property-naming-strategy: SNAKE_CASE

Micronaut 1.1.1 之前

Micronaut 构造 ObjectMapper使用 ObjectMapperFactory 不设置属性命名策略(至少在 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;
}
}
}

在此示例中,我添加了一个静态类 CustomObjectMapperFactory转到主Application类(class)和我用过@Replaces指示 Micronaut 使用此工厂类的注释和 objectMapper()此自定义工厂类提供的方法。 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"
}
<小时/>

更新:使用BeanCreatedEventListener<ObjectMapper>相反

还有一种替代方法可以实现相同的效果,并且需要更少的代码行。积分转到Micronaut Framework Twitter account :)

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

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

该解决方案的优点:

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

关于jackson - 如何配置 Jackson 在 Micronaut 中使用 SNAKE_CASE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53195071/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com