2012-11-07 4 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; 
    } 
} 

서비스는 JSP에서

@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; 
    } 
} 

입니다, 또한 제품의 서비스 필드에서 데이터를 얻을 필요가있다. 그래서 제 JQuery 콜백 함수에서 product.service.description과 같이 작성하여 데이터를 얻었습니다.

기본적으로 Jackson은 관련 서비스 개체 (또는 다른 사용자 지정 개체)를 매핑하지 않는 것으로 보입니다. 또한 나는 어떤 예외도 얻지 않을 것이다. JSP에서는 데이터를 얻지 못합니다. 그것은 다른 사용자 지정 개체를 필드로 포함하지 않는 개체의 Collection을 반환 할 때 잘 동작합니다.

작동하기위한 설정이 누락 되었습니까?

감사합니다.

+1

일부 디버깅/로깅을 컨트롤러에 추가하여 값을위한'service' 필드를 검사 해 보셨습니까? 컨트롤러 반환 진술 전에 보이지 않는다면 잭슨 때문이 아닙니다. 또한'FetchType.LAZY'를 제거하여 문제를 일으키는 지 확인하십시오. – nickdos

+0

예, 모든 것을 시도했지만 데이터가 완전히로드되고 있습니다. 서비스에서 FetchType.LAZY는 문제가되지 않으므로 쿼리에서 동적 인 페칭을 사용하여 데이터를 페치하므로 product.service에 데이터가로드됩니다. Btw, 나는 Spring 3.1.2를 사용하고 Jackson 1.9.8 jar를 넣었다. – anshumn

+0

이상하게 보입니다 ... 나는 잭슨을 같은 방식으로 사용했지만 문제가 없었습니다. '서비스'에 대한 코드를 표시하지 않았으므로 해당 클래스에 대해 뭔가있을 수 있음을 알 수 있습니다. getters를 확인하고 가능한 @@ JsonIgnore' 주석 (JSON 출력을 억제)을 찾으십시오. – nickdos

답변

0

최대 절전 모드 모듈을 jackson으로 사용하시는 것이 좋습니다. 이것은 최대 절전 모드로 초기화되지 않은 개체를 무시하는 데 도움이됩니다. 이렇게하면 예외가없고 완전히 초기화 된 변환 만 수행됩니다.

+0

감사합니다. 내가 잭슨에 대한 최대 절전 모드 모듈을 시도하고 봄에 사용자 정의 개체 매퍼 등록 된 링크를 제안했다. 하지만 작동하지 않습니다, 나는 MappingJackson2HttpMessageConverter에서 동일한 Lazyinitialization 예외를 얻고 있습니다. 이걸 좀 도와 주실 래요? 할 일이 좀 더 있다고 생각합니다. – anshumn

+0

성공적으로 구성 할 수있었습니다. 문제는 항목 때문이었습니다. 이 때문에 MappingJackson2HttpMessageConverter 인스턴스가 두 개 만들어졌습니다. mvc : annotation-config에서 messagesConverter를 구성 할 때 문제가 해결되었습니다. Lazyinitialization 때문에 예외가 더 이상 발생하지 않습니다. 감사! – anshumn

관련 문제