我对Quarkus应用程序中的ObjectMapper
配置进行了非常简单的调整,如Quarkus指南所述:
@Singleton
public class ObjectMapperConfig implements ObjectMapperCustomizer {
@Override
public void customize(ObjectMapper objectMapper) {
objectMapper.enable(SerializationFeature.WRAP_ROOT_VALUE);
objectMapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE);
objectMapper.registerModule(new JavaTimeModule());
}
}
我这样做是为了使用@JsonRootName
注释包装/解包我的对象:
@RegisterForReflection
@JsonRootName("article")
public class CreateArticleRequest {
private CreateArticleRequest(String title, String description, String body, List<String> tagList) {
this.title = title;
this.description = description;
this.body = body;
this.tagList = tagList;
}
private String title;
private String description;
private String body;
private List<String> tagList;
...
}
当与我的实际API相对时,这很好,但每当我在一个测试中使用restasured时,restasured似乎并不尊重我的ObjectMapper配置,也不会像注释所示那样包装CreateArticleRequest。
@QuarkusTest
public class ArticleResourceTest {
@Test
public void testCreateArticle() {
given()
.when()
.body(CREATE_ARTICLE_REQUEST)
.contentType(ContentType.JSON)
.log().all()
.post("/api/articles")
.then()
.statusCode(201)
.body("", equalTo(""))
.body("article.title", equalTo(ARTICLE_TITLE))
.body("article.favorited", equalTo(ARTICLE_FAVORITE))
.body("article.body", equalTo(ARTICLE_BODY))
.body("article.favoritesCount", equalTo(ARTICLE_FAVORITE_COUNT))
.body("article.taglist", equalTo(ARTICLE_TAG_LIST));
}
}
这将我的请求正文序列化为:
{
"title": "How to train your dragon",
"description": "Ever wonder how?",
"body": "Very carefully.",
"tagList": [
"dragons",
"training"
]
}
...而不是...
{
"article": {
"title": "How to train your dragon",
"description": "Ever wonder how?",
"body": "Very carefully.",
"tagList": [
"dragons",
"training"
]
}
}
我实际上可以通过手动配置RestAsared ObjectMapper来解决这个问题,如下所示:
@QuarkusTest
public class ArticleResourceTest {
@BeforeEach
void setUp() {
RestAssured.config = RestAssuredConfig.config().objectMapperConfig(new ObjectMapperConfig().jackson2ObjectMapperFactory(
(cls, charset) -> {
ObjectMapper mapper = new ObjectMapper().findAndRegisterModules();
mapper.enable(SerializationFeature.WRAP_ROOT_VALUE);
mapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE);
mapper.registerModule(new JavaTimeModule());
return mapper;
}
));
}
}
然而,我显然不想这样做!我希望重新启动以获取我的ObjectMapper配置,这样我就不需要保留两种不同的ObjectMapper配置。
为什么不捡起来?我错过了什么?
我解决了这个问题
@QuarkusTest
public class RESTResourceTest {
@Inject
ObjectMapper mapper;
@BeforeEach
void setUp() {
RestAssured.config = RestAssured.config().objectMapperConfig(new ObjectMapperConfig().jackson2ObjectMapperFactory( (cls, charset) -> mapper ));
}
在我的src/main/java中的其他地方,我有我的自定义ObjectMapper定制器:
import javax.inject.Singleton;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.cloudevents.jackson.JsonFormat;
import io.quarkus.jackson.ObjectMapperCustomizer;
@Singleton
public class QuarkusObjectMapperCustomizer implements ObjectMapperCustomizer {
public void customize(ObjectMapper mapper) {
mapper.registerModule(JsonFormat.getCloudEventJacksonModule());
}
}
只是为了更新,以防有人发现像我这样的人。。。
我只是添加Singleton ObjectMapperConfig,这是工作
<quarkus.platform.version>2.3.0.Final</quarkus.platform.version>
<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>rest-assured</artifactId>
<scope>test</scope>
</dependency>
在nGinx服务器端,客户端的连接保持活动时间设置为30秒。但是使用这段代码和附加的日志,HttpClient 4.3。不尊重keep alive并在每次请求后关闭连接。为什么会这样? 我反复尝试netstat-an,发现客户机在for循环执行期间的不同时间打开了不同的端口,每2秒就有一次FIN状态,然后得出了这个结论。 下面给出的日志还显示,everyrequest之后连接已关闭 这些是日志。
我希望将concur严格用作配置源。我正在使用spring cloud Consor配置来获取配置。我正在使用git2consul将文件加载到Consor并读取它们。根据spring云文档,我在构建中添加了以下内容。格拉德尔 并在我的application.properties 我面临的问题是,预期的属性没有加载到ConfigurationProperties bean中。在ConsultProp
restas 是一个基于hunchentoot的web框架(Common Lisp),可以直接用quicklisp安装。 (ql:quickload :cl-who)(ql:quickload :restas) 其主要特点是: RESTAS的开发旨在简化遵循REST体系结构样式的Web应用程序的开发。 RESTAS是基于对Hunchentoot HTTP服务器。Web应用程序开发与RESTAS在许
我有一个Camel-ReST路由,它使用Jackson将集合转换为JSON,但当集合中的对象包含LocalDate时,它会抛出一个错误(没有LocalDate,一切都很好)。 com.fasterxml.jackson.databind.exc.:默认不支持Java8日期/时间类型:添加模块"com.fasterxml.jackson.datatype: jackson-datatype-jsr3
问题内容: 在纯Java SE 6环境中: Eclipse控制台中未显示任何内容。 l.info(“”) 及以上的作品就好了,但低于任何 罚款 只是似乎没有工作。有什么问题吗?TIA。 问题答案: 即使Logger级别设置为ALL,ConsoleHandler(记录器上的默认Handler)仍然具有INFO的默认级别。这来自 JAVA_HOME / jre / lib中 的默认logging.pr