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

RestAs保不尊重Quarkus中的ObjectMapper配置

章青青
2023-03-14

我对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配置。

为什么不捡起来?我错过了什么?

共有3个答案

左丘源
2023-03-14

我解决了这个问题

@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());
    }
}
姚骁
2023-03-14

只是为了更新,以防有人发现像我这样的人。。。

我只是添加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>
宗政博
2023-03-14

所以实际上Quarkus不会自动执行此操作(因为它会干扰本机测试)。

但是,您可以使用:

@Inject
ObjectMapper

在测试内部,设置<代码>重新启动。配置

 类似资料:
  • 在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