今天web项目报了一个java.lang.NoSuchMethodError错误,详情如下:
java.lang.NoSuchMethodException: com.sinosoft.crm.dto.custom.CRMFactorEvaluateDto.setCHANNELSCORE(java.lang.Long)
at java.lang.Class.getMethod(Class.java:1607)
at com.sinosoft.framework.reference.Result.invokeMethod(Result.java:411)
at com.sinosoft.framework.reference.Result.result2Object(Result.java:261)
at com.sinosoft.framework.reference.Result.result2Objects(Result.java:109)
at com.sinosoft.framework.reference.QueryDBManager.getResultList(QueryDBManager.java:96)
at com.sinosoft.framework.reference.DtoManager.querySQL(DtoManager.java:208)
at com.sinosoft.framework.reference.DtoManager.querySQL(DtoManager.java:148)
at com.sinosoft.crm.bl.facade.BLCommonFacade.findBySQL(BLCommonFacade.java:207)
at com.sinosoft.crm.bl.facade.BLCommonFacade.findBySQL(BLCommonFacade.java:192)
at com.sinosoft.crm.ui.control.UIFactorEvaluateControl.findCurrentInfo(UIFactorEvaluateControl.java:104)
at com.sinosoft.crm.ui.action.UIFactorEvaluateAction.initEdit(UIFactorEvaluateAction.java:75)
at sun.reflect.GeneratedMethodAccessor290.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.sinosoft.crm.ui.action.BaseAction.execute(BaseAction.java:114)
at org.apache.struts.chain.commands.servlet.ExecuteAction.execute(ExecuteAction.java:58)
at org.apache.struts.chain.commands.AbstractExecuteAction.execute(AbstractExecuteAction.java:67)
at org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51)
at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:191)
at org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:305)
at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:191)
at org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:449)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:301)
at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:26)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:60)
at org.ecside.filter.ECSideFilter.doFilter(ECSideFilter.java:188)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:60)
at com.sinosoft.framework.web.control.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:71)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:60)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3748)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3714)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2283)
at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2182)
at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1499)
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:263)
at weblogic.work.ExecuteThread.run(ExecuteThread.java:221)
错误分析:应该是数据类型转化错误,所以跟进了一下错误中报的代码:
public Integer getCHANNELSCORE() {
return CHANNELSCORE;
}
public void setCHANNELSCORE(Integer cHANNELSCORE) {
CHANNELSCORE = cHANNELSCORE;
}
可以看到项目代码定义的getCHANNELSCORE是Integer类型的,传递过程中变成了Long类型,查了很久是因为Oracle数据库CHANNELSCORE字段长度定义问题,问题详情:因为定义的Number字段长度为10,所以在映射中,CHANNELSCORE返回的数据类型变成了Long,所以报出NoSuchMethodError,映射详情:
number(1) boolean Boolean
number(2)2至4之间 byte Byte
number(8)4至8之间 integer Integer
numbernumber(10)8以上 long Long