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

Spring MVC测试,MockMVC:方便地将对象转换为JSON

孟成化
2023-03-14

我习惯了JAX-RS,并且希望在使用Spring MVC发送请求和处理响应时也有类似的舒适感,即在我的测试中的客户端。

在服务器(控制器)端,我对自动转换非常满意,也就是说,只返回一个对象实例并在发送给客户机的结果HTTP响应中包含JSON就足够了。

您能告诉我如何在这些代码片段中将<code>objectInstance

String jsonStringRequest = objectMapper.writeValueAsString(objectInstance);

ResultActions resultActions = mockMvc.perform(post(PATH)
    .contentType(MediaType.APPLICATION_JSON)
    .content(jsonStringRequest)
)

String jsonStringResponse = resultActions.andReturn().getResponse().getContentAsString();
Some objectInstanceResponse = objectMapper.readValue(jsonStringResponse, Some.class);

为了比较,使用JAX-RS客户端API,我可以使用<code>request.post(Entity.Entity(objectInstance,MediaType.APPLICATION_JSON_TYPE)response.readEntity(Some.class)读取响应

共有1个答案

申奇希
2023-03-14

如果您有很多响应对象,您可以创建一些通用的JsonToObject映射器工厂。然后,它可以用于从泛型响应(所有响应对象继承自同一泛型类)中检测对象类型,并从错误的映射尝试中正确响应/记录。

我手头没有代码示例,但作为伪代码:

public abstract GenericResponse {
  public String responseClassName = null;
  // get/set
}

服务器代码中,将实际响应对象的名称添加到此类。

JsonToObject工厂

public ConverterFactory<T> {
   private T objectType;
   public ConverterFactory(T type) {
     objectType = type;
   }

  public T convert(String jsonString) {
    // Type check
    GenericResponse genResp = mapper.readValue(result.getResponse().getContentAsString(),
            GenericResponse.class);
    if (objectType.getClass().getSimpleName().equals(genResp.getResponseClassName())) {
      // ObjectMapper code
      return mapper.readValue(result.getResponse().getContentAsString(),
            objectType.class);
    } else {
      // Error handling
    }
  }
}

我认为这可以扩展到和注释一起使用,在响应上做更多的自动化魔术。(开始用BeanPostProcessor检查)

@Component
public class AnnotationWorker implements BeanPostProcessor {

  @Override
  public Object postProcessBeforeInitialization(final Object bean, String name) throws BeansException {
    ReflectionUtils.doWithFields(bean.getClass(), field -> {
        // make the field accessible if defined private
        ReflectionUtils.makeAccessible(field);
        if (field.getAnnotation(MyAnnotation.class) != null) {
            field.set(bean, log);
        }
    });
    return bean;
  }
}

上面的代码片段是从我当前的项目中复制的,它注入到字段中,你需要修改它,使它适用于方法,例如...你可能需要它的地方。

实现这一切可能很棘手,甚至不能说它一定有效,但如果你不介意一点教育工作,这是可以尝试的。

 类似资料:
  • 问题内容: 我有一个JSON对象,我将其转换为并在此处进行一些处理。稍后,我想转换相同的缓冲区数据以转换为有效的JSON对象。 我正在研究Node V6.9.1 下面是我尝试过的代码,但是当我转换回JSON却无法打开该对象时遇到了。 所以我尝试使用检查方式打印整个对象 如果我尝试像数组一样读取它 我也尝试解析它抛出 我需要将其视为我创建的真实对象(我的意思是像上面声明的那样)。 请帮忙.. 问题答

  • 我正试图将下面的json转换成java bean,需要你的帮助 Sort.json 我的豆子看起来像 我的测试课是 我看到的错误是 请建议:

  • 我有一个带有对象的数组()。对象包含一个 orgId 和一个 orgName。 有没有一种简便的方法可以将它转换成< code>Map[Long,String] (orgId,orgName)

  • 例如:Date值为:“dateCollected”:fri Jul 07 00:00:00 IST 1989, 但它只服用星期五而不是整个日期。

  • 问题内容: 我正在将struts2用于Action,将jquery用于UI … 我想知道如何将Map对象转换为JSON对象并将其发送回UI, 现在可以在JSP页面中将其打印为普通的Java Map对象: 但我希望它是这样的: 我将如何实现这一目标…? 问题答案: 尝试Gson: 不过,我不建议将这种代码放入JSP。诸如此类的事情应该存在于Servlet或Action类之类的控制器中。 您还绝对不希

  • 问题内容: 我对服务进行了调用,并将响应存储在中。但是,我试图将其转换为类对象并得到错误。这是我的代码: 响应如下所示: 这是该类的样子: 但是我得到了错误: 我究竟做错了什么? 编辑1: 这是从答案中使用gson的尝试: 但是我得到了错误: 问题答案: 找出问题所在。需要提取jsonobject而不是获取字符串。这是解决此问题的行: