相关疑难解决方法(0)

注册器使用JAXB注释在Spring 3.1.2中MappingJackson2HttpMessageConverter

我有许多具有JAXB注释的实体,我想使用消息转换器将其转换为JSON.

我知道我读取JAXB注释的ObjectMapper有效:

String correctJsonText = jacksonObjectMapper.writeValueAsString(entityWithJAXB); 
Run Code Online (Sandbox Code Playgroud)

但是当我调用我的rest服务时,默认注册的MappingJacksonHttpMessageConverter(未配置为读取JAXB)似乎接管了 - 当忽略@XmlTransient时,由于循环引用而导致堆栈溢出...

如何配置Spring使用MappingJackson2HttpMessageConverter?

当前配置

<mvc:annotation-driven>
    <mvc:message-converters register-defaults="false">
        <bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
            <property name="objectMapper" ref="jacksonObjectMapper" />
            <property name="supportedMediaTypes">
                <list>
                    <bean class="org.springframework.http.MediaType">
                        <constructor-arg index="0" value="application" />
                        <constructor-arg index="1" value="json" />
                        <constructor-arg index="2" value="UTF-8" />
                    </bean>
                </list>
            </property>

        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>

<bean id="jaxbAnnotationInspector" class="com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector" />

<bean id="jacksonObjectMapper" class="com.fasterxml.jackson.databind.ObjectMapper">
    <property name="annotationIntrospector" ref="jaxbAnnotationInspector" />
</bean>
Run Code Online (Sandbox Code Playgroud)

REST服务

@RequestMapping(value="/{id}", method=RequestMethod.GET, produces = "application/json;charset=UTF-8")
public @ResponseBody EntityWithJAXB readEntityWithJAXB(@PathVariable int id, Model model) {
    return entityService.getById(id);
}
Run Code Online (Sandbox Code Playgroud)

依赖

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.0.5</version>
</dependency> …
Run Code Online (Sandbox Code Playgroud)

spring json mocking jaxb jackson

9
推荐指数
1
解决办法
3万
查看次数

如何在 MockMvc 中使用 Gson 而不是 Jackson?

我花了一天的时间试图找到解决方案,但找不到任何解决此问题的在线资源。

我正在为我的应用程序使用 Gson 进行消息转换,它在单元测试之外工作正常。我什至添加了一个HttpMessageConvertersbean 来优先于 Jackson,而不是将配置值写入application.yml. 这仅在运行应用程序时有效。

现在我的问题是,我如何使用 Gson 序列化/反序列化MockMvc?我有一个带有@SerializedName("field_one")注释的类,其值与实际名称不同。我最接近找到答案的是下面一个没有帮助的答案:

/sf/answers/1435701991/

任何想法如何替换ObjectMapperMockMvc使用 Gson 而不是 Jackson?


编辑:要添加更多上下文:

当我尝试发送一个Model用 Gson 转换为 Json 的文件时,它立即被拒绝(400),因为我@NotNull对模型中的每个字段都有注释。当它在控制器中反序列化时,它将字段设置为空。下面的例子有@Valid,它确保Model签出。

@RequestMapping(value = "accept", method = RequestMethod.POST)
public Model resp(@Valid @RequestBody Model model){
    return model;
}
Run Code Online (Sandbox Code Playgroud)

另一方面,当我到达一个没有 的端点时@Valid,传递了一个让杰克逊满意的 json,然后我得到了一个模型,我无法检查任何字段:

mockMvc.perform(
    post("/test/accept")
        .contentType(MediaType.APPLICATION_JSON)
        .content(json))
    .andExpect(jsonPath("$.field_one", is("Hello world!")))
Run Code Online (Sandbox Code Playgroud)

例外:

java.lang.AssertionError: No value at JSON path "$.field_one", exception: No results for …
Run Code Online (Sandbox Code Playgroud)

java jackson gson mockmvc

5
推荐指数
1
解决办法
446
查看次数

标签 统计

jackson ×2

gson ×1

java ×1

jaxb ×1

json ×1

mocking ×1

mockmvc ×1

spring ×1