SpringMVC 3 - 在<c:foreach>列表对象中显示嵌套对象属性时出错</c:foreach>

时间:2011-12-02 09:38:11

标签: spring-mvc

我是Spring MVC的新手。在我的小crm项目中,我想显示一个带有嵌套对象的objectList。但它只显示对象名称中的一个对象,如de.fischerlandmaschinen.crm.model.Employee@6018ebcc statt转换后的名称字符串。

以下是代码:

域:

@Entity
@Table(name = "CUSTOMER")
public class Customer implements Serializable {
private static final long serialVersionUID = 5015685214532097319L;

private Long id;
private String foreignId;

private String title;
private String firstName;
private String middleName;
@NotEmpty
private String lastName;
@Enumerated(EnumType.STRING)
private Gender gender;
@Past
@Temporal(TemporalType.DATE)
private Date dateOfBirth;
@Valid
private Address address = new Address();
@Valid
private Contact contact = new Contact();
private Company company = null; // new Company();
private String notice;

@Past
@Temporal(TemporalType.DATE)
private Date createdDate;
@Past
@Version
@Temporal(TemporalType.DATE)
private Date lastUpdatedDate;
private String status;

private Employee primaryConsultant = null;  //new Employee();
private Employee secondaryConsultant = null;    //new Employee();

public Customer(){
    createdDate = new Date();
    lastUpdatedDate = new Date();
}

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "customer_id")
public Long getId() {
    return id;
}
public void setId(Long customerId) {
    this.id = customerId;
}

@Column(name = "foreign_id")
public String getForeignId() {
    return foreignId;
}
public void setForeignId(String foreignId) {
    this.foreignId = foreignId;
}

@OneToOne(cascade = CascadeType.ALL)
public Address getAddress() {
    return address;
}
public void setAddress(Address address) {
    this.address = address;
}

@OneToOne(cascade = CascadeType.ALL)
public Contact getContact() {
    return contact;
}
public void setContact(Contact contact) {
    this.contact = contact;
}

@Column(name = "created_date")
public Date getCreatedDate() {
    return createdDate;
}
public void setCreatedDate(Date createdDate) {
    this.createdDate = createdDate;
}
public String getStatus() {
    return status;
}
public void setStatus(String status) {
    this.status = status;
}
public String getTitle() {
    return title;
}
public void setTitle(String title) {
    this.title = title;
}
public String getFirstName() {
    return firstName;
}
public void setFirstName(String firstName) {
    this.firstName = firstName;
}
public String getMiddleName() {
    return middleName;
}
public void setMiddleName(String middleName) {
    this.middleName = middleName;
}
public String getLastName() {
    return lastName;
}
public void setLastName(String lastName) {
    this.lastName = lastName;
}
public Gender getGender() {
    return gender;
}
public void setGender(Gender gender) {
    this.gender = gender;
}

@Column(name = "date_of_birth")
public Date getDateOfBirth() {
    return dateOfBirth;
}
public void setDateOfBirth(Date dateOfBirth) {
    this.dateOfBirth = dateOfBirth;
}

@ManyToOne(fetch=FetchType.LAZY, cascade = { CascadeType.MERGE,    CascadeType.PERSIST, CascadeType.REFRESH })
@JoinColumn(name="company", nullable=true)
public Company getCompany() {
    return company;
}
public void setCompany(Company company) {
    this.company = company;
}

public String getNotice() {
    return notice;
}
public void setNotice(String notice) {
    this.notice = notice;
}


@Column(name = "last_updated_date")
public Date getLastUpdatedDate() {
    return lastUpdatedDate;
}
public void setLastUpdatedDate(Date lastUpdatedDate) {
    this.lastUpdatedDate = lastUpdatedDate;
}

//  @ManyToOne(fetch=FetchType.LAZY, cascade = { CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH })
@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name="primary_consultant", nullable=true)
public Employee getPrimaryConsultant() {
    return primaryConsultant;
}
public void setPrimaryConsultant(Employee primaryConsultant) {
    this.primaryConsultant = primaryConsultant;
}

//  @ManyToOne(fetch=FetchType.LAZY, cascade = { CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH })
@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name="secondary_consultant", nullable=true)
public Employee getSecondaryConsultant() {
    return secondaryConsultant;
}
public void setSecondaryConsultant(Employee secondaryConsultant) {
    this.secondaryConsultant = secondaryConsultant;
}


  }

和员工域:

@Entity
@Table(name = "EMPLOYEE")
public class Employee implements Serializable {

private static final long serialVersionUID = 1L;

private Long id;
private String alias;
private String title;
private String firstName;
private String middleName;
private String lastName;

    // getter and setter
}

在我的控制器中:

@RequestMapping(value = "customer/list")
public ModelAndView list() {
    ModelAndView mav = new ModelAndView("customer/list");
    List<Customer> customers = customerService.getAllCustomers();
    mav.addObject("customerList", customers);
    return mav;
}

@InitBinder
protected void initBinder(WebDataBinder binder) {
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy");
    dateFormat.setLenient(false);
    binder.setAutoGrowNestedPaths(false);
    binder.registerCustomEditor(Date.class, new CustomDateEditor(
            dateFormat, true));

    binder.registerCustomEditor(Gender.class, new GenderEditor());

    binder.registerCustomEditor(Employee.class,
            new CustomEmployeePropertyEditor(employeeService));
}

我有一个CustomEmployeePropertyEditor为initBinder扩展了PropertyEditorSupport:

@Override
public void setAsText(String text) {
    logger.info("convert string to employee object");

    if (text == null || text.length() == 0) {
        setValue(null);
        return;
    }

    Long id = (Long) typeConverter.convertIfNecessary(text, Long.class);

    if (id == null) {
        setValue(null);
        return;
    }

    setValue(employeeService.getEmployee(id));

}

@Override
public String getAsText() {
    logger.info("convert employee object to string");

    Object obj = getValue();
    if (obj == null) {
        return null;
    }

    return (String) typeConverter.convertIfNecessary(
            ((Employee) obj).getLastName(), String.class);
}
    @Override
public void setAsText(String text) {
    logger.info("convert string to employee object");

    if (text == null || text.length() == 0) {
        setValue(null);
        return;
    }

    Long id = (Long) typeConverter.convertIfNecessary(text, Long.class);

    if (id == null) {
        setValue(null);
        return;
    }

    setValue(employeeService.getEmployee(id));

}

@Override
public String getAsText() {
    logger.info("convert employee object to string");

    Object obj = getValue();
    if (obj == null) {
        return null;
    }

    return (String) typeConverter.convertIfNecessary(
            ((Employee) obj).getLastName(), String.class);
}

并且死于JSP代码:

<c:forEach items="${customerList}" var="customer">
   <tr>
                <td>${customer.id}</td>
                ...
                <td>${customer.primaryConsultant}</td>
                <td>${customer.secondaryConsultant}</td>

                                    ...
   </tr>

</c:forEach>

但是我在浏览器中得到了不需要的结果:

  

de.fischerlandmaschinen.crm.model.Employee@6018ebcc         在primaryConsultant和secondaryConsultant字段中

有什么不对。我查找registerCustomEditor的文档。它说,它也可以用于嵌套路径属性。路径属性是什么意思? .jsp页面中的路径或域对象中的属性?

感谢

路德维希

1 个答案:

答案 0 :(得分:0)

覆盖Employee类中的toString()方法,并写入要在浏览器中显示的字段值。这是我现在能想到的唯一方法。 :)