2016-07-19 3 views
2

Я привык к JAX-RS и хотел бы иметь такой же комфорт при отправке запросов с использованием Spring MVC и работе с ответами, то есть на стороне клиента внутри моих тестов ,Spring MVC Test, 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); 

Для сравнения с клиентом API JAX-RS можно легко отправить объект, используя 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; 
    } 
} 

выше фрагмент кода копируется из моего текущего проекта и впрыскивает в областях, вам нужно изменить его так, что он работает для методов, например, ... где вам может понадобиться Это.

Выполнение этого все может быть сложным и не может сказать, что оно обязательно работает даже, но это то, что нужно попробовать, если вы не возражаете против учебной работы.

Смежные вопросы