【问题标题】:Spring Rest Issue春季休息问题
【发布时间】:2014-07-08 07:25:24
【问题描述】:

我在尝试使用 Spring RestApi 测试“testCreateUser”方法时遇到错误,uploadNewUser.xml 包含有关用户和角色的登录信息。

  @Test
  public void testCreateUser() throws Exception {
    Reader reader = getFileReader("src/test/resources/uploadNewUser.xml");
    String input_xml = IOUtils.toString(reader);

    byte[] content = input_xml.getBytes();
    request.addHeader("Accept", "application/xml");
    request.addHeader("Content-Type", "application/xml");
    request.setContent(content);
    request.setContentType("text/xml");
    request.setMethod(RequestMethod.POST.name());
    request.setRequestURI("/restapi/users/");
    final ModelAndView mav = handle(request, response);
    Map<String, Object> map = mav.getModel();
    for (Entry<String, Object> entry : map.entrySet()) {
      String key = entry.getKey();
      UserCollection collection = (UserCollection) entry.getValue();

org.springframework.validation.BindingResult.error = com.xxx.dashboard.restapi.GlobalResponse@42a4fd6d

错误堆栈:

java.lang.ClassCastException: com.xxx.dashboard.restapi.GlobalResponse cannot be cast to com.xxx.dashboard.restapi.UserCollection

我遇到了无法将 GlobalRespose 转换为 UserCollection 的问题。谁能告诉我我到底在哪里做错了?任何帮助或指点都非常欢迎提前谢谢

 @Controller("userrestapi")
    @RequestMapping(value = { "/restapi/users/", "/restapi/users" })
    public class UserRestApi extends AbstractBaseApi {
...
         @RequestMapping(method = RequestMethod.POST)
          @ResponseStatus(value = HttpStatus.CREATED)
          public ModelAndView createNewUser(@RequestBody UserCollection userCollection,
              @RequestHeader(value = "accept", required = false) String accept,
              @RequestHeader(value = "version", required = false) String version) {
            try {
              OOUser ooUser = userCollection.getUsers().get(0);
              Mapper mapper = (Mapper) userVersions.get(Constants.USER_DETAIL_VERSION_MAPPER_KEY);
              int userId = usersRestApiService.validateAndCreateNewUser(ooUser, mapper);
              List<FilterField> filterFieldList = new ArrayList<FilterField>();
              filterFieldList.add(new FilterField("userId", String.valueOf(userId)));
              return getUserDetailsForFilter(filterFieldList, accept, version, mapper);
            } catch (Exception ex) {
              logger.warn("Api exception", ex);
              return getModelAndView(accept, "error", getGlobalResponse(ex));
            }

abstractbaseapi 包含以下内容

public class AbstractBaseApi {

  public static final String XML_VIEW = "apiXmlView";
  public static final String JSON_VIEW = "apiJsonView";
  public static final String JSON_ACCEPT_HEADER = "application/json";
  public static final String JSON_CONTENT_HEADER = "Content-type: application/json";
  public static final String XML_CONTENT_HEADER = "Content-type: text/html;charset=utf-8";
  public static final int MAX_COUNT = 100;
  public static final String XML_REQUEST_ERROR_FORMAT = "<?xml version='1.0' encoding='UTF-8'?><GlobalResponse xmlns='http://www.operative.com/api' xmlns:v2='http://www.operative.com/api/v2' xmlns:v1='http://www.operative.com/api/v1'> <error errorCode='%1$s' text='%2$s'/> </GlobalResponse>";
  public static final String JSON_REQUEST_ERROR_FORMAT = "{error:{errorCode:'%1$s',text:'%2$s'}}";

  protected final Logger logger = Logger.getLogger(this.getClass());

  protected ModelAndView getModelAndView(String accept, String key, Object value) {
    String view = XML_VIEW;

    if (accept != null && accept.toLowerCase().contains(JSON_ACCEPT_HEADER)) {
      view = JSON_VIEW;
    }
    if (logger.isDebugEnabled()) {
      logger.debug("Accept Header:" + accept + " , generating:" + view);
    }

    return new ModelAndView(view, BindingResult.MODEL_KEY_PREFIX + key, value);
  }

【问题讨论】:

  • 你能不能编辑一下,这样我们就可以清楚地看到代码和错误信息了..
  • 嗨,尼尔斯,我正在编辑帖子以便您清楚地看到错误消息。
  • 你能把你的控制器方法也展示一下吗?

标签: spring unit-testing rest


【解决方案1】:

您的模型包含的内容比您想象的要多。

您正在浏览您的模型并寻找您的用户集合。但是,您的地图中第一个遇到的对象似乎是 GlobalResponse 地图。

您可能应该只从模型中按名称获取它,即

UserCollection collection = (UserCollection) mav.getModel().get("userCollection");

而不是迭代..

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-14
    • 1970-01-01
    • 1970-01-01
    • 2013-03-23
    • 2015-03-15
    • 1970-01-01
    相关资源
    最近更新 更多