2016-07-19 108 views
2

我习惯了JAX-RS,并想使用Spring MVC里面我的测试客户端发送请求时,并与响应工作,即有类似的舒适性。Spring MVC的测试,MockMVC:便利对象转换为/从JSON

在服务器(控制器)侧我与自动转换很高兴,即它足以仅仅返回的对象实例,并且具有在JSON发送到客户端所产生的HTTP响应。

您能否告诉我如何解决在这些片段中将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

,如果您有响应的对象很多的响应,你可以创建一些通用JsonToObject mapper-厂。它可以再用来检测从一个普通的响应对象类型(所有响应对象来自同一个通用类继承)和响应/从坏的映射尝试正确登录。

我没有一个代码示例在眼前,但作为一个伪代码:

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; 
    } 
} 

上面的代码片断是从我目前的项目复制并将其注入到田地,你需要改变它的话,它适用于方法,例如......在这里你可能需要它。

说完这一切实现的可能有猫腻,不能说它一定的工作就算了,但它的一些尝试,如果你不介意一点点的教育工作。