我正在尝试通过@Controller来使用Spring Rest服务。但是我遇到了这样一种情况,其中一个方法调用正在使用有效数据进行响应,而其他已过滤的方法调用则返回了错误的响应。这是我的controller

@Controller
@RequestMapping("/company")
public class CompanyDetailsController {

@Autowired
private CompanyServices companyServices;

@RequestMapping(method = RequestMethod.GET)
public @ResponseBody List<CompanyDetails> getCompanyDetails() {
    return companyServices.getCompanyDetails();
}

@RequestMapping(value = "/{companyShortCode}", method = RequestMethod.GET)
public @ResponseBody CompanyDetails getCompanyDetails(@PathVariable("companyShortCode") String companyShortCode) {
    System.out.println("companyShortCode = "+companyShortCode);
    CompanyDetails companyDetails = companyServices.getCompanyDetails(companyShortCode);
    /*CompanyDetails companyDetails = new CompanyDetails();
    companyDetails.setCompanyCode("abc");
    companyDetails.setCompanyEmail("[email protected]");
    companyDetails.setCompanyPhone(92349234);
    companyDetails.setWebSite("abc.abc.com");
    System.out.println("companyDetails = "+companyDetails);*/
    return companyDetails;
}
}


CompanyDetails

@Entity
@Table(name = "company_details")
@JsonIgnoreProperties({ "hibernateLazyInitializer", "handler" })
public class CompanyDetails implements Serializable {

private static final long serialVersionUID = 8713608417980657723L;

@Id
@Column(name="COMPANY_CODE", nullable = false, updatable = false)
private String companyCode = null;

@Column(name = "COMPANY_NAME", nullable = false, updatable = true)
private String companyName = null;

@Column(name = "COMPANY_PHONE", nullable = true, updatable = true)
private long companyPhone = 0;

@Column(name = "COMPANY_EMAIL", nullable = true, updatable = true)
private String companyEmail = null;

@Column(name = "COMPANY_WEBSITE", nullable = true, updatable = true)
private String webSite = null;

public String getCompanyCode() {
    return companyCode;
}

public void setCompanyCode(String companyCode) {
    this.companyCode = companyCode;
}

public String getCompanyName() {
    return companyName;
}

public void setCompanyName(String companyName) {
    this.companyName = companyName;
}

public long getCompanyPhone() {
    return companyPhone;
}

public void setCompanyPhone(long companyPhone) {
    this.companyPhone = companyPhone;
}

public String getCompanyEmail() {
    return companyEmail;
}

public void setCompanyEmail(String companyEmail) {
    this.companyEmail = companyEmail;
}

public String getWebSite() {
    return webSite;
}

public void setWebSite(String webSite) {
    this.webSite = webSite;
}

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result
            + ((companyCode == null) ? 0 : companyCode.hashCode());
    result = prime * result
            + ((companyName == null) ? 0 : companyName.hashCode());
    return result;
}

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    CompanyDetails other = (CompanyDetails) obj;
    if (companyCode == null) {
        if (other.companyCode != null)
            return false;
    } else if (!companyCode.equals(other.companyCode))
        return false;
    if (companyName == null) {
        if (other.companyName != null)
            return false;
    } else if (!companyName.equals(other.companyName))
        return false;
    return true;
}

@Override
public String toString() {
    return "CompanyDetails [companyCode=" + companyCode + ", companyName="
            + companyName + ", companyPhone=" + companyPhone
            + ", companyEmail=" + companyEmail + ", webSite=" + webSite
            + "]";
}
}


Repository

@Repository
public class DetailsDaoImpl implements DetailsDao {

private SessionFactory sessionFactory;

public void setSessionFactory(SessionFactory sessionFactory) {
    this.sessionFactory = sessionFactory;
}
@Override
@Transactional(readOnly = true)
public List<CompanyDetails> getCompanyDetails() {
    List<CompanyDetails> details = (List<CompanyDetails>) sessionFactory.getCurrentSession().createCriteria(CompanyDetails.class).list();
    return details;
}

@Override
@Transactional(readOnly = true)
public CompanyDetails getCompanyDetails(String companyShortCode) {
    System.out.println("companyShortCode = "+companyShortCode);
    CompanyDetails details = (CompanyDetails) sessionFactory.getCurrentSession().load(CompanyDetails.class, companyShortCode);
    System.out.println("details = "+details);
    return details;
}
}


Service

public class CompanyServicesImpl implements CompanyServices {

@Autowired
DetailsDao detailsDao;

@Override
public List<CompanyDetails> getCompanyDetails() {
    return detailsDao.getCompanyDetails();

}

@Override
public CompanyDetails getCompanyDetails(String companyShortCode) {
    System.out.println("companyShortCode = "+companyShortCode);
    return detailsDao.getCompanyDetails(companyShortCode);
}

}


如果我呼叫List<CompanyDetails> getCompanyDetails(),它将返回-

[
  {
  "companyCode": "ABCD",
  "companyName": "Test Company",
  "companyPhone": 11226123456,
  "companyEmail": "[email protected]",
  "webSite": "www.abc.com"
   },
  {
  "companyCode": "XYZA",
  "companyName": "XYZA Company",
  "companyPhone": 1122000000,
  "companyEmail": "[email protected]",
  "webSite": "www.XYZA.com"
   }
]


但是当我打电话-Public @ResponseBody CompanyDetails getCompanyDetails(@PathVariable("companyShortCode") String companyShortCode) {时,
它返回-

{"companyPhone": 0}


我尝试使用虚拟对象,并将其放入Json。尝试创建普通的bean,而不创建@Entity,并使用BeanUtils复制属性并响应正确的Json。有人知道为什么会这样吗?

更新

在发送响应之前,它打印为CompanyDetails [companyCode=ABCD, companyName=Test Company, companyPhone=9823611147, [email protected], webSite=www.abc.com]

最佳答案

public CompanyDetails getCompanyDetails(String companyShortCode)方法中,当使用主键CompanyDetails检索companyShortCode对象时,正在使用load方法。

load方法返回仅设置“主键”属性而未设置所有其他属性的代理对象。仅当您为诸如session之类的属性调用getter方法中的任何一种时,您的details.getCompanyEmail()对象才会发送查询以检索实际对象。

因此,为避免这种情况,您可以调用get方法。参见下面的代码片段:

@Override
@Transactional(readOnly = true)
public CompanyDetails getCompanyDetails(String companyShortCode) {
    System.out.println("companyShortCode = "+companyShortCode);
    CompanyDetails details = (CompanyDetails) sessionFactory.getCurrentSession().get(CompanyDetails.class, companyShortCode);
    System.out.println("details = "+details);
    return details;
}
}


如果要使用加载方法,请使用以下代码片段:

@Override
@Transactional(readOnly = true)
public CompanyDetails getCompanyDetails(String companyShortCode) {
    System.out.println("companyShortCode = "+companyShortCode);
    CompanyDetails details = (CompanyDetails) sessionFactory.getCurrentSession().load(CompanyDetails.class, companyShortCode);
    details.getCompanyName(); //after this all attribute of CompanyDetails object will be set
    System.out.println("details = "+details);
    return details;
}
}


有关更多参考,请参见this

希望能帮助到你。

07-26 05:20