【发布时间】:2014-01-10 13:38:02
【问题描述】:
我正在尝试访问我的数据库以获取信息,但它一直在抛出空异常。
我已经调用对象和技术人员对象/
addTech.jsp:
<%@page import="com.example.backend.BackendFactory"%>
<%@page import="java.util.ArrayList"%>
<%@page import="com.example.model.*"%>
<%@ page language="java" contentType="text/html; charset=windows-1255"
pageEncoding="windows-1255"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Adding Tech</title>
</head>
<%
String TechId, TechName, TechUserName, TechPass, TechPassVer, TechRank, TechSecQ, TechSecA, TechEmail, TechPhone;
TechName = request.getParameter("TechName");
TechUserName = request.getParameter("TechUserName");
TechPass = request.getParameter("TechPass");
TechPassVer = request.getParameter("TechPassVer");
TechRank = request.getParameter("TechRank");
TechSecQ = request.getParameter("TechSecQ");
TechSecA = request.getParameter("TechSecA");
TechEmail = request.getParameter("TechEmail");
TechPhone = request.getParameter("TechPhone");
if (TechName != null && TechUserName != null && TechPass != null
&& TechPassVer != null && TechRank != null
&& TechSecQ != null && TechSecA != null
&& TechEmail != null && TechPhone != null)
{
Technician t = new Technician(TechName, TechUserName, TechPass,
new ArrayList<Call>(), TechnicianRank.Beginner,
TechSecQ, TechSecA, TechPhone, TechEmail, (float) 0.0);
BackendFactory.getInstance().addTechnician(t);
}
%>
<body>
<h1>Adding Technican</h1>
<form name="tempForm" action="addTech.jsp" method="get">
<table align="left" border="0" cellpadding="1" cellspacing="1"
style="width: 500px;">
<tbody>
<tr>
<td><strong style="color: rgb(255, 0, 0);"><u>Tech
Details:</u></strong></td>
<td> </td>
<td> </td>
</tr>
<tr>
<td> </td>
<td>Id:</td>
<td><input name="TechId" readonly="readonly" type="text"
value=<%out.print(BackendFactory.getInstance().getTechnicianCurrentId());%> /></td>
</tr>
<tr>
<td> </td>
<td>Name:</td>
<td><input name="TechName" type="text" value="Your first name" /></td>
</tr>
<tr>
<td> </td>
<td>User name:</td>
<td><input name="TechUserName" type="text"
value="Your last name" /></td>
</tr>
<tr>
<td> </td>
<td>Password:</td>
<td><input name="TechPass" type="password" /></td>
</tr>
<tr>
<td> </td>
<td>Verify Password:</td>
<td><input name="TechPassVer" type="password" /></td>
</tr>
<tr>
<td> </td>
<td>Rank:</td>
<td><input name="TechRank" readonly="readonly" type="text"
value="Beginer" /></td>
</tr>
<tr>
<td> </td>
<td>Security Q:</td>
<td><input name="TechSecQ" size="30" type="text"
value="Whats your grandmother birth?" /></td>
</tr>
<tr>
<td> </td>
<td>Security A:</td>
<td><input name="TechSecA" size="30" type="text"
value="Dont remember..." /></td>
</tr>
<tr>
<td> </td>
<td>Email:</td>
<td><input name="TechEmail" type="text"
value="example@gmail.com" /></td>
</tr>
<tr>
<td> </td>
<td>Phone:</td>
<td><input name="TechPhone" type="text" value="0123456789" /></td>
</tr>
<tr>
<td> </td>
<td> </td>
<td><input name="addTech" type="submit" value="Submit" /></td>
</tr>
</tbody>
</table>
</form>
</body>
</html>
addCall.jsp:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@page import="com.google.gwt.dom.client.SelectElement"%>
<%@page import="sun.reflect.CallerSensitive"%>
<%@page import="java.util.List"%>
<%@page import="java.util.ArrayList"%>
<html>
<%@page import="com.example.model.*"%>
<%@page import="com.example.backend.BackendFactory"%>
<%@page import="com.example.backend.ServerBackend"%>
<%@ page language="java" contentType="text/html; charset=windows-1255"
pageEncoding="windows-1255"%>
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=windows-1255">
<title>Insert title here</title>
</head>
<body>
<h1>Adding Call
<%/*out.print(backend.findTechByName("sabag"));*/%>
</h1>
<form name="tempForm" action="addCall.jsp" method="get">
<%!ServerBackend backend = BackendFactory.getInstance();%>
<%
/*backend.addTechnician(new Technician());*/
//
String desc, tech, techRank, ClientAddress, ClientFirst, ClientLast;
desc = request.getParameter("desc");
tech = request.getParameter("tech");
ClientAddress = request.getParameter("ClientAddress");
ClientFirst = request.getParameter("ClientFirst");
ClientLast = request.getParameter("ClientLast");
Technician t=null ;
if (tech != null)
{
try
{
t=backend.findTechByName(tech);
} catch (Exception e)
{
t = new Technician();
t.setName(tech);
backend.addTechnician(t);
}
}
if (desc != null && tech != null && ClientAddress != null
&& ClientFirst != null && ClientLast != null)
{
Call call = new Call();
call.setDescription(desc);
call.setCaller(new Client(ClientFirst + ClientLast,
new Address(ClientAddress, ClientAddress,
ClientAddress, 45)));
call.setTechnician(t);
backend.addCall(call);
}
/**/
%>
<table align="left" border="0" cellpadding="1" cellspacing="1"
style="width: 500px;">
<tbody>
<tr>
<td><strong style="color: rgb(255, 0, 0);"><u>Call
Details:</u></strong></td>
<td> </td>
<td> </td>
</tr>
<tr>
<td> </td>
<td>Id:</td>
<td>
<div>
<input name="id" readonly="readonly" type="text"
value=<%out.print(backend.getCallCurrentId());%> />
</div>
</td>
</tr>
<tr>
<td> </td>
<td>Description:</td>
<td><textarea name="desc"></textarea></td>
</tr>
<tr>
<td> </td>
<td>Technician:</td>
<td><select name="tech" size="1">
<%
try
{
List<String> lst=backend.getAllTechsNames();
for(String s : lst) {
%>
<option value="100">
<%
out.print(s);
%>
</option>
<%
}
}
catch(Exception e)
{
%>
<option>
<%
out.println("fdghjk");
%>
</option>
<%
}
%>
</select> </td>
</tr>
<tr>
<td><strong><u><span
style="color: rgb(255, 0, 0);">Caller Details:</span></u></strong></td>
<td> </td>
<td> </td>
</tr>
<tr>
<td> </td>
<td>First name</td>
<td><input name="ClientFirst" type="text"
value="Your first name" /></td>
</tr>
<tr>
<td> </td>
<td>Last name</td>
<td><input name="ClientLast" type="text"
value="Your last name" /></td>
</tr>
<tr>
<td> </td>
<td>Address</td>
<td><input name="ClientAddress" type="text"
value="Your address" /></td>
</tr>
<tr>
<td> </td>
<td> </td>
<td><input name="addCall" type="submit" value="Submit" /></td>
</tr>
</tbody>
</table>
</form>
</body>
</html>
还有最重要的: DBBackend代码:
package com.example.backend;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.persistence.TypedQuery;
import com.example.model.Call;
import com.example.model.CallStatus;
import com.example.model.SparePart;
import com.example.model.Technician;
import com.example.model.ThingToDo;
public class DBbackend implements Backend
{
private EntityManagerFactory emf = null;
private EntityManager em = null;
private String PERSISTENCE_UNIT_NAME = "transactions-optional";
//
public DBbackend()
{
emf = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
em = emf.createEntityManager();
}
private void insert(Object obj) throws Exception
{
em.getTransaction().begin();
em.persist(obj);
try
{
em.getTransaction().commit();
} catch (Exception e)
{
em.clear();
throw e;
}
}
@Override
public int getNextCallId()
{
// TODO Auto-generated method stub
return 0;
}
@Override
public void removeCall(int id) throws Exception
{
// TODO Auto-generated method stub
}
@Override
public ArrayList<Call> getCallsByTech(Technician t) throws Exception
{
// TODO Auto-generated method stub
return null;
}
@Override
public void updateCall(Call call) throws Exception
{
// TODO Auto-generated method stub
}
@Override
public void save()
{
// TODO Auto-generated method stub
}
@Override
public void addCall(Call call) throws Exception
{
// TODO Auto-generated method stub
}
@Override
public void addTechnician(Technician technician) throws Exception
{
// TODO Auto-generated method stub
insert(technician);
}
@Override
public Technician getTechnicianByUserName(String userName) throws Exception
{
// TODO Auto-generated method stub
return null;
}
@Override
public Call getCall(int id) throws Exception
{
// TODO Auto-generated method stub
return null;
}
@Override
public void addCallToTech(Call call, Technician t) throws Exception
{
// TODO Auto-generated method stub
call.setTechnician(t);
insert(call);
}
@Override
public Technician findTechByName(String name) throws Exception
{
// TODO Auto-generated method stub
Query q = em.createQuery(
"SELECT technician FROM Technician technician "
+ "WHERE technician.name = :Name ", Technician.class);
q.setParameter("Name", name);
return (Technician) q.getSingleResult();
}
@SuppressWarnings("unchecked")
@Override
public List<String> getAllTechsNames() throws Exception
{
// TODO Auto-generated method stub
TypedQuery<Technician> query =
em.createQuery("SELECT p FROM Technician p", Technician.class);
List<Technician> results = query.getResultList();
List<String> nameList = new ArrayList<String>();
for (Technician item : results)
nameList.add(item.getName());
return nameList;
}
@Override
public ArrayList<String> blabla() throws Exception
{
// TODO Auto-generated method stub
Query q = em.createQuery(
"SELECT technician FROM Technician technician",
Technician.class);
@SuppressWarnings("unchecked")
List<Technician> lst = q.getResultList();
ArrayList<String> nameList = new ArrayList<String>();
for (Technician item : lst)
nameList.add(item.getName());
return nameList;
}
@Override
public int getTechnicianCurrentId()
{
// TODO Auto-generated method stub
return Technician.getIdCount();
}
@Override
public int getCallCurrentId()
{
// TODO Auto-generated method stub
return Call.getIdCount();
}
}
堆栈跟踪:
来源:com.google.appengine.datanucleus.query.QueryEntityPKFetchFieldManager.fetchIntField(QueryEntityPKFetchFieldManager.java:70) 类:com.google.appengine.datanucleus.query.QueryEntityPKFetchFieldManager 方法:fetchIntField 行:70来源:org.datanucleus.identity .IdentityUtils.getApplicationIdentityForResultSetRow(IdentityUtils.java:93) 类:org.datanucleus.identity.IdentityUtils 方法:getApplicationIdentityForResultSetRow 行:93Source:com.google.appengine.datanucleus.EntityUtils.entityToPojo(EntityUtils.java:1011) 类:com.google .appengine.datanucleus.EntityUtils 方法:entityToPojo 行:1011 来源:com.google.appengine.datanucleus.query.DatastoreQuery$2.apply(DatastoreQuery.java:229) 类:com.google.appengine.datanucleus.query.DatastoreQuery$2 方法:申请行:229来源:com.google.appengine.datanucleus.query.DatastoreQuery$2.apply(DatastoreQuery.java:226) 类:com.google.appengine.datanucleus.query.DatastoreQuery$2 方法:申请行:226来源:com.goog le.appengine.datanucleus.query.LazyResult.resolveNext(LazyResult.java:96) 类:com.google.appengine.datanucleus.query.LazyResult 方法:resolveNext 行:96Source:com.google.appengine.datanucleus.query.LazyResult。 resolveAll(LazyResult.java:121) 类:com.google.appengine.datanucleus.query.LazyResult 方法:resolveAll 行:121Source:com.google.appengine.datanucleus.query.LazyResult.size(LazyResult.java:115) 类: com.google.appengine.datanucleus.query.LazyResult 方法:size 行:115Source:com.google.appengine.datanucleus.query.StreamingQueryResult.size(StreamingQueryResult.java:151) 类:com.google.appengine.datanucleus.query。 StreamingQueryResult 方法:size 行:151Source:org.datanucleus.store.query.AbstractQueryResult.toArray(AbstractQueryResult.java:400) 类:org.datanucleus.store.query.AbstractQueryResult 方法:toArray 行:400Source:java.util.ArrayList。 addAll(ArrayList.java:530) 类:java.util.ArrayList 方法:addAll 行:530Source:org.datanucleus.query。 evaluator.JavaQueryEvaluator.execute(JavaQueryEvaluator.java:160) 类:org.datanucleus.query.evaluator.JavaQueryEvaluator 方法:执行行:160 来源:org.datanucleus.query.evaluator.JPQLEvaluator.execute(JPQLEvaluator.java:112) 类: org.datanucleus.query.evaluator.JPQLEvaluator 方法:执行行:112 来源:com.google.appengine.datanucleus.query.JPQLQuery.performExecute(JPQLQuery.java:200) 类:com.google.appengine.datanucleus.query.JPQLQuery 方法: performExecute Line: 200Source: org.datanucleus.store.query.Query.executeQuery(Query.java:1789) Class: org.datanucleus.store.query.Query Method: executeQuery Line: 1789Source: org.datanucleus.store.query。 Query.executeWithMap(Query.java:1693) 类:org.datanucleus.store.query.Query 方法:executeWithMap 行:1693Source:org.datanucleus.api.jpa.JPAQuery.getSingleResult(JPAQuery.java:232) 类:org. datanucleus.api.jpa.JPAQuery 方法:getSingleResult 行:232Source:com.example.backend.DBbackend.findTechByName(DBbackend.jav a:124) 类:com.example.backend.DBbackend 方法:findTechByName 行:124Source:com.example.backend.ServerBackend.findTechByName(ServerBackend.java:101) 类:com.example.backend.ServerBackend 方法:findTechByName 行: 101来源:org.apache.jsp.addCall_jsp._jspService(addCall_jsp.java:81) 类:org.apache.jsp.addCall_jsp 方法:_jspService 行:81来源:org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java: 97)类:org.apache.jasper.runtime.HttpJspBase 方法:服务行:97来源:javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 类:javax.servlet.http.HttpServlet 方法:服务行: 717来源:org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:377) 类:org.apache.jasper.servlet.JspServletWrapper 方法:服务行:377来源:org.apache.jasper.servlet.JspServlet.serviceJspFile( JspServlet.java:313) 类:org.apache.jasper.servlet.JspServlet 方法:serviceJspFile 行:313Source:org.apache.jasper.servlet.JspServle t.service(JspServlet.java:260) 类:org.apache.jasper.servlet.JspServlet 方法:服务行:260 来源:com.google.appengine.tools.development.PrivilegedJspServlet.access$101(PrivilegedJspServlet.java:23) 类:com.google.appengine.tools.development.PrivilegedJspServlet 方法:access$101 行:23 来源:com.google.appengine.tools.development.PrivilegedJspServlet$2.run(PrivilegedJspServlet.java:61) 类:com.google.appengine.tools .development.PrivilegedJspServlet$2 方法:运行行:61 来源:java.security.AccessController.doPrivileged(Native Method) 类:java.security.AccessController 方法:doPrivileged 行:-2 来源:com.google.appengine.tools.development.PrivilegedJspServlet。 service(PrivilegedJspServlet.java:58) 类:com.google.appengine.tools.development.PrivilegedJspServlet 方法:service 行:58Source:javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 类:javax.servlet。 http.HttpServlet 方法:service Line:717Source:org.mortbay.jetty.servlet.Servlet Holder.handle(ServletHolder.java:511) 类:org.mortbay.jetty.servlet.ServletHolder 方法:句柄行:511Source:org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166) 类: org.mortbay.jetty.servlet.ServletHandler$CachedChain 方法:doFilter 行:1166 来源:com.google.appengine.api.socket.dev.DevSocketFilter.doFilter(DevSocketFilter.java:74) 类:com.google.appengine.api。 socket.dev.DevSocketFilter 方法:doFilter 行:74 来源:org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 类:org.mortbay.jetty.servlet.ServletHandler$CachedChain 方法:doFilter 行: 1157Source:com.google.appengine.tools.development.ResponseRewriterFilter.doFilter(ResponseRewriterFilter.java:123) 类:com.google.appengine.tools.development.ResponseRewriterFilter 方法:doFilter 行:123Source:org.mortbay.jetty.servlet。 ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 类:org.mortbay.jetty.servlet.ServletHand ler$CachedChain 方法:doFilter 行:1157Source:com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:34) 类:com.google.appengine.tools.development.HeaderVerificationFilter 方法:doFilter 行:34Source: org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 类:org.mortbay.jetty.servlet.ServletHandler$CachedChain 方法:doFilter 行:1157Source:com.google.appengine.api.blobstore。 dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:63) 类:com.google.appengine.api.blobstore.dev.ServeBlobFilter 方法:doFilter 行:63Source:org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler. java:1157) 类:org.mortbay.jetty.servlet.ServletHandler$CachedChain 方法:doFilter 行:1157Source:com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43) 类:com.google。 apphosting.utils.servlet.TransactionCleanupFilter 方法:doFilter行:43 来源:org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 类:org.mortbay.jetty.servlet.ServletHandler$CachedChain 方法:doFilter 行:1157 来源:com.google.appengine。 tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:125) 类:com.google.appengine.tools.development.StaticFileFilter 方法:doFilter 行:125Source:org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler. java:1157) 类:org.mortbay.jetty.servlet.ServletHandler$CachedChain 方法:doFilter 行:1157Source:com.google.appengine.tools.development.DevAppServerModulesFilter.doDirectRequest(DevAppServerModulesFilter.java:368) 类:com.google。 appengine.tools.development.DevAppServerModulesFilter 方法:doDirectRequest 行:368 来源:com.google.appengine.tools.development.DevAppServerModulesFilter.doDirectModuleRequest(DevAppServerModulesFilter.java:351) 类:com.google.appengine.tools.development.DevAppServerModulesFilter Met hod:doDirectModuleRequest 行:351Source:com.google.appengine.tools.development.DevAppServerModulesFilter.doFilter(DevAppServerModulesFilter.java:116) 类:com.google.appengine.tools.development.DevAppServerModulesFilter 方法:doFilter 行:116Source:org.mortbay .jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 类:org.mortbay.jetty.servlet.ServletHandler$CachedChain 方法:doFilter 行:1157Source:org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler .java:388) 类:org.mortbay.jetty.servlet.ServletHandler 方法:handle 行:388Source:org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) 类:org.mortbay.jetty.security .SecurityHandler 方法:handle Line:216Source:org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) Class:org.mortbay.jetty.servlet.SessionHandler 方法:handle Line:182Source:org.mortbay.jetty .handler.ContextHandler.handle(ContextHandler.java:765) 类:org.mortbay.j etty.handler.ContextHandler 方法:句柄行:765来源:org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418) 类:org.mortbay.jetty.webapp.WebAppContext 方法:句柄行:418来源:com. google.appengine.tools.development.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:97) 类:com.google.appengine.tools.development.DevAppEngineWebAppContext 方法:句柄行:97来源:org.mortbay.jetty.handler.HandlerWrapper.handle( HandlerWrapper.java:152) 类:org.mortbay.jetty.handler.HandlerWrapper 方法:handle 行:152Source:com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:485) 类:com. google.appengine.tools.development.JettyContainerService$ApiProxyHandler 方法:handle 行:485 来源:org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 类:org.mortbay.jetty.handler.HandlerWrapper 方法:handle行:152 来源:org.mortbay.jetty.Server.handle(Server.java: 326) 类:org.mortbay.jetty.Server 方法:handle 行:326Source:org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542) 类:org.mortbay.jetty.HttpConnection 方法:handleRequest 行:542Source: org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923) 类:org.mortbay.jetty.HttpConnection$RequestHandler 方法:headerComplete 行:923Source:org.mortbay.jetty.HttpParser.parseNext(HttpParser.java: 547) 类:org.mortbay.jetty.HttpParser 方法:parseNext 行:547Source:org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212) 类:org.mortbay.jetty.HttpParser 方法:parseAvailable 行:212Source: org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) 类:org.mortbay.jetty.HttpConnection 方法:handle 行:404Source:org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)类:org.mortbay.io.nio.SelectChannelEndPoint 方法:运行行:409Source:org.mortbay.thread.QueuedThreadPoo l$PoolThread.run(QueuedThreadPool.java:582) 类:org.mortbay.thread.QueuedThreadPool$PoolThread 方法:运行行:582 }
我无法从中选择任何东西!!!
【问题讨论】:
-
添加您的错误堆栈跟踪以诊断您的问题..
-
只是一个建议:类名以大写开头,变量以小写开头。
-
我已经添加了堆栈跟踪
标签: sql jsp jpa web-applications