我已经习惯了JAX-RS,并希望在使用Spring MVC发送请求并处理响应时也有类似的安慰,即在我的测试中的客户端。
在服务器(控制器)方面,我对自动转换非常满意,即只需返回一个对象实例,并将生成的HTTP响应中的JSON发送给客户端。
您能否告诉我如何解决在这些片段中将objectInstance
转换为jsonString
或反之亦然的手动过程?如果可能,我还想跳过手动配置内容类型。
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,我可以使用request.post(Entity.entity(objectInstance, MediaType.APPLICATION_JSON_TYPE)
轻松发送对象,并使用response.readEntity(Some.class);
答案 0 :(得分:0)
如果你有很多响应对象,你可以创建一些通用的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;
}
}
上面的代码片段从我当前的项目中复制并注入到字段中,您需要更改它,以便它适用于方法,例如......您可能需要它。
实现这一切可能会很棘手,并且不能说它必然会起作用,但如果你不介意一些教育性的工作,那就要尝试了。