我正在尝试通过@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
希望能帮助到你。