我有一个场景,我通过来自服务器的AJAX响应来填充JSP中的下拉框。在控制器中,我正在重新调整一个Product对象集合,并使用@ResponseBody注释了返回类型。Spring MVC使用Jackson返回ajax响应
控制器 -
@RequestMapping(value="/getServicesForMarket", method = RequestMethod.GET)
public @ResponseBody Collection<Product> getServices(@RequestParam(value="marketId", required=true) int marketId) {
Collection<Product> products = marketService.getProducts(marketId);
return products;
}
和产品是
@Entity
@Table(name = "PRODUCT")
public class Product implements Serializable {
private static final long serialVersionUID = 1L;
private int id;
private Market market;
private Service service;
private int price;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name = "MARKET_ID")
public Market getMarket() {
return market;
}
public void setMarket(Market market) {
this.market = market;
}
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name = "SERVICE_ID")
public Service getService() {
return service;
}
public void setService(Service service) {
this.service = service;
}
@Column(name = "PRICE")
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
}
服务是
@Entity
@Table(name="SERVICE")
public class Service implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private int id;
private String name;
private String description;
@Id
@GeneratedValue
@Column(name="ID")
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Column(name="NAME")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Column(name="DESCRIPTION")
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
在JSP中,我需要从同样产品的服务领域获得的数据。所以我在我的JQuery回调函数中,我写了类似product.service.description来获取数据。
似乎默认情况下,杰克逊没有映射关联的服务对象(或任何其他自定义对象)。此外,我没有得到任何例外。在JSP中,我没有收到数据。当我返回某个不包含任何其他自定义对象的对象的集合作为其字段时,它工作正常。
我是否缺少这项工作的任何设置?
谢谢!
您是否曾尝试在控制器中添加一些调试/日志记录以检查“服务”字段的值?如果你在控制器返回声明之前没有看到它,那么这不是由于Jackson。也可以尝试删除'FetchType.LAZY'来查看是否导致问题。 – nickdos
是的,我已经尝试了所有这些,数据即将完全加载。 FetchType.LAZY不是问题,因为在服务中,我使用查询中的动态获取来获取数据,因此product.service会加载数据。顺便说一句,我使用的是Spring 3.1.2,并且已经把杰克逊1.9.8罐子。 – anshumn
似乎很奇怪......我以同样的方式使用了杰克逊,并没有遇到任何问题。鉴于您没有向我们展示“服务”的代码,它会表明可能有关于该类的内容。检查getter并寻找任何可能的'@ JsonIgnore'注解(这会抑制JSON输出)。 – nickdos