서버로부터의 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을 반환 할 때 잘 동작합니다.
작동하기위한 설정이 누락 되었습니까?
감사합니다.
일부 디버깅/로깅을 컨트롤러에 추가하여 값을위한'service' 필드를 검사 해 보셨습니까? 컨트롤러 반환 진술 전에 보이지 않는다면 잭슨 때문이 아닙니다. 또한'FetchType.LAZY'를 제거하여 문제를 일으키는 지 확인하십시오. – nickdos
예, 모든 것을 시도했지만 데이터가 완전히로드되고 있습니다. 서비스에서 FetchType.LAZY는 문제가되지 않으므로 쿼리에서 동적 인 페칭을 사용하여 데이터를 페치하므로 product.service에 데이터가로드됩니다. Btw, 나는 Spring 3.1.2를 사용하고 Jackson 1.9.8 jar를 넣었다. – anshumn
이상하게 보입니다 ... 나는 잭슨을 같은 방식으로 사용했지만 문제가 없었습니다. '서비스'에 대한 코드를 표시하지 않았으므로 해당 클래스에 대해 뭔가있을 수 있음을 알 수 있습니다. getters를 확인하고 가능한 @@ JsonIgnore' 주석 (JSON 출력을 억제)을 찾으십시오. – nickdos