我想提出一個RESTful應用程序,並試圖對象列表轉換成JSON用於特定URL(@RequestMapping/@ResponseBody)使用Jackson2與Spring 4.0(MVC + REST +休眠)
我有傑克遜hibernate4和jackson-core,databind等在我的classpath中。
這是我的對象,我想在json中轉換。
@Entity
@Table(name="Product")
public class Product {
@Id
@Column(name="productId")
@GeneratedValue
protected int productId;
@Column(name="Product_Name")
protected String name;
@Column(name="price")
protected BigDecimal baseprice;
@OneToMany(cascade = javax.persistence.CascadeType.ALL,mappedBy="product",fetch=FetchType.EAGER)
protected List<ProductOption> productoption = new ArrayList<ProductOption>();
@OneToMany(cascade = javax.persistence.CascadeType.ALL,mappedBy="product",fetch=FetchType.EAGER)
protected List<ProductSubOption> productSubOption = new ArrayList<ProductSubOption>();
@ManyToOne
@JoinColumn(name="ofVendor")
protected Vendor vendor;
產品內部的兩個對象也都是POJO'S ..
這裏是我的方法檢索產品
@Override
public List<Product> getMenuForVendor(int vendorId) {
List<Product> result = em.createQuery("from "+Product.class.getName()+" where ofVendor = :vendorId").setParameter("vendorId", vendorId).getResultList();
System.out.println(result.size());
return result;
}
名單當我嘗試在我的控制器我回到這個名單得到一個「不能懶惰地加載JSON」,所以我設置我的對象熱切地提取。 這裏是我的控制器
@Autowired
private MenuDaoImpl ms;
@RequestMapping(value = "/{vendorId}", method = RequestMethod.GET)
public @ResponseBody List<Product> getMenu(@PathVariable int vendorId){
List<Product> Menu = Collections.unmodifiableList(ms.getMenuForVendor(vendorId));
return Menu;
}
現在,當我打我的網址本地主機:8080 /使用getMenu/1我應該得到一個JSON字符串顯示,但我得到的錯誤的大名單
WARN : org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver - Handling of [org.springframework.http.converter.HttpMessageNotWritableException] resulted in Exception
java.lang.IllegalStateException: Cannot call sendError() after the response has been committed
at org.apache.catalina.connector.ResponseFacade.sendError(ResponseFacade.java:467)
Could not write JSON: Infinite recursion (StackOverflowError) (through reference chain:
我不知道我是否缺少任何東西。請指導。
好像你在你的實體中有循環引用。 –
我只是在某種程度上能夠在我的瀏覽器上得到json,但現在它無限打印,直到我的控制檯上有一個stackoverflow ..它在哪裏有這個循環.. – Nikhil
'Vendor'是否有'Product' ? –