`
sillycat
  • 浏览: 2542760 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Spring3 and REST Integeration(VIII)REST ERROR Handler and JSON Mapper Infinite

 
阅读更多
Spring3 and REST Integeration(VIII)REST ERROR Handler and JSON Mapper Infinite

First, how can I handle the REST error message in my REST API.
There is an example. In my get method in Person Conroller, I try to make a throw Exception like this:
if (id.equalsIgnoreCase("13")) {
     thrownew JsonServiceException("101",
     "Id can not be 13. Because I do not like it.");
}

The JsonServiceException will be a simple exception class extends Exception:
package com.sillycat.easyrestserver.exception;

publicclass JsonServiceException extends Exception {

privatestaticfinallongserialVersionUID = -2949102718021710130L;

private String errorCode;
private String errorMessage;

public JsonServiceException(String errorCode, String errorMessage) {
this.errorCode = errorCode;
this.errorMessage = errorMessage;
}

public String getErrorCode() {
returnerrorCode;
}

publicvoid setErrorCode(String errorCode) {
this.errorCode = errorCode;
}

public String getErrorMessage() {
returnerrorMessage;
}

publicvoid setErrorMessage(String errorMessage) {
this.errorMessage = errorMessage;
}
}

The handler in controller will be as follow:
@ExceptionHandler(JsonServiceException.class)
publicvoid handleJsonServiceException(JsonServiceException exception,
HttpServletResponse response) throws IOException {
     response.sendError(HttpServletResponse.SC_NOT_FOUND,
          exception.getErrorMessage());
}

The test implementation will be as follow:
publicvoid throwJSONError() throws Exception {
     person.setId(13);
     Mockito.when(mockPersonService.get(13)).thenReturn(person);

     MockMvcBuilders
     .standaloneSetup(personController)
     .build()
     .perform(
     MockMvcRequestBuilders.get("/person/13").accept(
     MediaType.APPLICATION_JSON))
     .andExpect(status().isNotFound());
}

I make my objects like these, person will have one company, but company will have many persons. The mock object will be as follow:
person = new Person(3, "person3");
Person person1 = new Person(1, "person1");

Company company1 = new Company(1, "company1");

List<Person> personList = new ArrayList<Person>();
personList.add(person);
personList.add(person1);
company1.setPersons(personList);

person.setCompany(company1);

I execute the same junit test case, I will get these error messages.
error message:
org.codehaus.jackson.map.JsonMappingException: Infinite recursion (StackOverflowError) (through reference chain: com.sillycat.easyrestserver.model.Company["persons"]->java.util.ArrayList[0]->com.sillycat.easyrestserver.model.Person["company"]->com.sillycat.easyrestserver.model.Company["persons"]->java.util.ArrayList[0]->com.sillycat.easyrestserver.model.Person["company"]-

That is because of infinite json mapper here. So the solution for these kind of problem will be the annotation supported in latest jackson lib.
@JsonBackReference("Company-Person")
public Company getCompany() {
     returncompany;
}

and

@JsonManagedReference("Company-Person")
public List<Person> getPersons() {
     returnpersons;
}

That is it.

references:
分享到:
评论

相关推荐

    Pro Spring for Integeration

    ### Pro Spring for Integration #### 一、概览与背景 《Pro Spring for Integration》是一本由著名出版社Apress出版的英文书籍,旨在介绍如何利用Spring Integration框架构建企业级的集成解决方案。Spring作为一...

    Spring面试题 75道.pdf

    Spring面试题75道 spring是一个轻量级Java开发框架,由Rod Johnson创建,目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题。它是一个分层的JavaSE/JavaEE full-stack轻量级开源框架,为开发Java应用...

    工作流人工任务 Websphere Integeration Development 开发

    在WebSphere Integration Development中,可以使用Business Process Model and Notation (BPMN) 图形标准来描绘这些流程。 然后,我们需要创建人工任务节点。这些任务可以是简单的信息输入,也可以是复杂的决策过程...

    docker-jenkins-integeration

    docker-jenkins-integeration

    Process Integration7.0标准的安装文档

    标题:Process Integration 7.0标准的安装文档 在IT领域,尤其是企业级软件的部署与维护中,标准安装文档扮演着至关重要的角色。本文档是关于SAP NetWeaver Process Integration (PI) 7.1版本在Windows操作系统上...

    kettle下载-一款免费开源ETL工具

    3. **Steps**:Kettle提供了丰富的预定义步骤,涵盖数据输入、输出、转换等各个方面。用户也可以自定义步骤以满足特定需求。例如,`Table Input`用于从数据库中读取数据,`CSV File Output`则用于写入CSV文件。 4. ...

    西门子SCL语言实现低阶及高阶积分算法仿真案例.docx

    在西门子的编程环境中,首先在主OB1块中创建一个名为`Integeration_Algorithm`的FB(功能块),然后将该FB拖放到主OB1的梯形图中。为了存储变量,需要创建一个独立的全局DB(数据块)`TAG_DB`,在此处定义各个参数,...

    商务智能应用实例.pptx

    2. 新建一个Integeration Service项目 3. 在该项目中,右键单击SSIS包,然后选择“新建SSIS包” 10.2 商务智能中的数据挖掘模型设计 数据挖掘模型设计是指根据商务智能应用的需求,设计和建立数据挖掘模型,以便...

    bootstrap-easy-sidebar, 围绕主题集成和灵活性设计的Bootstrap 工具条.zip

    bootstrap-easy-sidebar, 围绕主题集成和灵活性设计的Bootstrap 工具条 bootstrap-easy-sidebar我看到了 Bootstrap的几个边栏,找到了大多数缺乏主题integeration和灵活性的领域。 通过继承导航栏的所有样式,然后在...

    ETL之PDI/Kettle9.x/8.x案例培训实战从入门到应用案例

    利用碎片化的时间学习即可,每天学习一小时或3个课时即可达到效果;时间充足者,自由安排 课程目标: 促使教育公平,打破教育壁垒,让ETL更加的大众化使用 课程简介: 【可视化介绍】 Kettle 是 PDI 以前的名称...

    i4C_Industry_4_0_Cell

    工业 4.0 单元 (i4C) - 根据工业 4.0 概念的机器人单元该项目的第一阶段涉及工业 4.0 背景下的机器人单元设计,并在布尔诺理工大学机械工程学院自动化与计算机科学研究所实施。 这一阶段项目的主要部分是单元的建设...

Global site tag (gtag.js) - Google Analytics