如何在 REST API 中将驼峰大小写转换为带下划线的小写?
How to convert camel case to lower case with underscores in a REST API?
我正在使用 Quarkus 和 Microprofile OpenAPI 来映射 REST API 中的实体。
我可以通过以下方式将我的驼峰命名属性转换为带下划线的小写:
@Schema(name = "first_name")
private String firstName;
然而,这很不方便,因为我必须在整个项目的任何地方都这样做。
问题:有没有一种方法可以自动对所有属性进行处理,而无需在注解中指定映射?
我查看了 Quarkus 和 Microprofile 的文档,但没有找到如何实现它。
我在 openapi 文档中找到了这个:
You can control how the Schema property names are dumped by setting
the micronaut.openapi.property.naming.strategy system property. It
accepts one of the following jackson's PropertyNamingStrategy: -
SNAKE_CASE, - UPPER_CAMEL_CASE, - LOWER_CAMEL_CASE, - LOWER_CASE and -
KEBAB_CASE.
有关详细信息,请参阅 Hibernate 5 Naming Strategy Configuration by baeldung。
如果您想将此行为设置为默认行为,则必须在负责 serialization/deserialization 个对象到 json 的对象映射器中进行配置。
在 Quarkus 中,您可以使用 Jackson 或 JsonB 进行对象映射。
对于 Jackson,您可以使用要设置为 SNAKE_CASE
的 PropertyNamingStrategy 来控制字段名称的行为。要全局设置它,请像这样创建一个 ObjectMapperCustomizer
:
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import io.quarkus.jackson.ObjectMapperCustomizer;
import javax.inject.Singleton;
@Singleton
public class ObjectMapperConfig implements ObjectMapperCustomizer {
@Override
public void customize(ObjectMapper objectMapper) {
objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE)
}
}
您可以控制序列化的更多方面,例如在反序列化、日期格式化等过程中忽略未知属性
你需要有一个部门 quarkus-resteasy-jackson
:
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-resteasy-jackson</artifactId>
</dependency>
如果你想使用 JsonB (quarkus-resteasy-jsonb
) 那么你可以用下面的方法试试 JsonbConfigCustomizer
import io.quarkus.jsonb.JsonbConfigCustomizer;
import javax.inject.Singleton;
import javax.json.bind.JsonbConfig;
import javax.json.bind.config.PropertyNamingStrategy;
@Singleton
public class JsonBCustomizer implements JsonbConfigCustomizer {
public void customize(JsonbConfig config) {
config.withPropertyNamingStrategy(PropertyNamingStrategy.LOWER_CASE_WITH_UNDERSCORES);
}
}
我正在使用 Quarkus 和 Microprofile OpenAPI 来映射 REST API 中的实体。 我可以通过以下方式将我的驼峰命名属性转换为带下划线的小写:
@Schema(name = "first_name")
private String firstName;
然而,这很不方便,因为我必须在整个项目的任何地方都这样做。
问题:有没有一种方法可以自动对所有属性进行处理,而无需在注解中指定映射?
我查看了 Quarkus 和 Microprofile 的文档,但没有找到如何实现它。
我在 openapi 文档中找到了这个:
You can control how the Schema property names are dumped by setting the micronaut.openapi.property.naming.strategy system property. It accepts one of the following jackson's PropertyNamingStrategy: - SNAKE_CASE, - UPPER_CAMEL_CASE, - LOWER_CAMEL_CASE, - LOWER_CASE and - KEBAB_CASE.
有关详细信息,请参阅 Hibernate 5 Naming Strategy Configuration by baeldung。
如果您想将此行为设置为默认行为,则必须在负责 serialization/deserialization 个对象到 json 的对象映射器中进行配置。 在 Quarkus 中,您可以使用 Jackson 或 JsonB 进行对象映射。
对于 Jackson,您可以使用要设置为 SNAKE_CASE
的 PropertyNamingStrategy 来控制字段名称的行为。要全局设置它,请像这样创建一个 ObjectMapperCustomizer
:
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import io.quarkus.jackson.ObjectMapperCustomizer;
import javax.inject.Singleton;
@Singleton
public class ObjectMapperConfig implements ObjectMapperCustomizer {
@Override
public void customize(ObjectMapper objectMapper) {
objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE)
}
}
您可以控制序列化的更多方面,例如在反序列化、日期格式化等过程中忽略未知属性
你需要有一个部门 quarkus-resteasy-jackson
:
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-resteasy-jackson</artifactId>
</dependency>
如果你想使用 JsonB (quarkus-resteasy-jsonb
) 那么你可以用下面的方法试试 JsonbConfigCustomizer
import io.quarkus.jsonb.JsonbConfigCustomizer;
import javax.inject.Singleton;
import javax.json.bind.JsonbConfig;
import javax.json.bind.config.PropertyNamingStrategy;
@Singleton
public class JsonBCustomizer implements JsonbConfigCustomizer {
public void customize(JsonbConfig config) {
config.withPropertyNamingStrategy(PropertyNamingStrategy.LOWER_CASE_WITH_UNDERSCORES);
}
}