我尝试在使用Micronaut时使用SNAKE_CASE将jackson配置为接受JSON,但是,它无法识别属性jackson.property-命名-策略:SNAKE_CASE
。
这已在本问题的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)
}
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 在代码中,我试图以 我在试图访问他们的代码得到以下错误