2012-11-07 118 views
0

我有一个场景,我通过来自服务器的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中,我没有收到数据。当我返回某个不包含任何其他自定义对象的对象的集合作为其字段时,它工作正常。

我是否缺少这项工作的任何设置?

谢谢!

+1

您是否曾尝试在控制器中添加一些调试/日志记录以检查“服务”字段的值?如果你在控制器返回声明之前没有看到它,那么这不是由于Jackson。也可以尝试删除'FetchType.LAZY'来查看是否导致问题。 – nickdos

+0

是的,我已经尝试了所有这些,数据即将完全加载。 FetchType.LAZY不是问题,因为在服务中,我使用查询中的动态获取来获取数据,因此product.service会加载数据。顺便说一句,我使用的是Spring 3.1.2,并且已经把杰克逊1.9.8罐子。 – anshumn

+0

似乎很奇怪......我以同样的方式使用了杰克逊,并没有遇到任何问题。鉴于您没有向我们展示“服务”的代码,它会表明可能有关于该类的内容。检查getter并寻找任何可能的'@ JsonIgnore'注解(这会抑制JSON输出)。 – nickdos

回答

0

我会建议使用休眠模块jackson,这将帮助您忽略休眠未初始化的对象。这样你就不会有例外,只有完全初始化的转换。

+0

谢谢Jigar提出这个建议。我试了一下Jackson的Hibernate模块,并在链接上建议用Spring注册自定义对象映射器。但它不起作用,我在MappingJackson2HttpMessageConverter中获得了相同的Lazyinitialization异常。你能帮我解决这个问题吗?我认为还有一些设置需要完成。 – anshumn

+0

我能够成功配置。问题是由于条目。因为它有两个MappingJackson2HttpMessageConverter实例被创建。在mvc:annotation-config中配置messagesConverter时,问题已解决。由于Lazy初始化,异常不再发生。谢谢! – anshumn