SpringMVC Restful-Web-Service
Ich versuche zu bauen, ein RESTFUL-Web-Service jedoch erhalte ich eine Fehlermeldung unter ist mein code:
jsp
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js"></script>
<style>
<%@ include file="../css/forms.css" %>
</style>
<script type="text/javascript">
<%@ include file="../js/off_reg.js"%>
$(document).ready(function(){
$('#userName').blur(function(evt){
CheckAvailability();
});
});
function CheckAvailability(){
$.ajax( {
type:'GET', //Could be 'get' depending on your needs
url:'validateUserName.htm',
data:{userName:$('#userName').val()},
dataType: 'json',
success:function(data) {
alert(data);
}
});
}
</script>
DAO
public boolean OfficerExist(String userName){
try{
logger.debug("About to check if officers existing");
String sql = "SELECT userName FROM crimetrack.tblofficers WHERE userName = ?";
logger.info("at this point 1");
//String dbUserName = (String)results.get("userName");
String dbUserName = (String)getJdbcTemplate().queryForObject(sql, new Object[]{userName},String.class);
logger.info("after JdbcTemplate");
if (dbUserName.equals(userName)) {
logger.info("User Name Exists");
return true;
}else{
logger.info("User Name Does NOT Exists");
return false;
}
}catch(Exception e){
logger.info(e.getMessage());
return false;
}
}
FireBug-Konsole Fehler:
GET http://localhost:8084/crimeTrack/validateUserName.htm?userName=hello
500 Internal Server Error
70ms
jquery.min.js (line 2)
"NetworkError: 500 Internal Server Error - http://localhost:8084/crimeTrack /validateUserName.htm?userName=hello"
TomCat Error Log:
com.crimetrack.web.OfficerRegistrationController.validateUserName(java.lang.String,com.crimetrack.business.Officers,org.springframework.validation.BindingResult,org.springframework.ui.ModelMap) throws java.lang.Exception
306270 [http-8084-1] DEBUG com.crimetrack.web.OfficerRegistrationController - Inside Controller validateUserName
306270 [http-8084-1] DEBUG com.crimetrack.web.OfficerRegistrationController - The user name that came in is hello
306270 [http-8084-1] INFO com.crimetrack.service.ValidateUserNameManager - Inside Do UserNameExist
306270 [http-8084-1] DEBUG com.crimetrack.jdbc.JdbcOfficersDAO - About to check if officers existing
306270 [http-8084-1] INFO com.crimetrack.jdbc.JdbcOfficersDAO - User Name Found 1
306270 [http-8084-1] INFO com.crimetrack.jdbc.JdbcOfficersDAO - User Name Found 2
306270 [http-8084-1] DEBUG org.springframework.jdbc.core.JdbcTemplate - Executing prepared SQL query
306270 [http-8084-1] DEBUG org.springframework.jdbc.core.JdbcTemplate - Executing prepared SQL statement [SELECT userName FROM crimetrack.tblofficers WHERE userName = ?]
306270 [http-8084-1] DEBUG org.springframework.jdbc.datasource.DataSourceUtils - Fetching JDBC Connection from DataSource
306285 [http-8084-1] DEBUG org.springframework.jdbc.core.StatementCreatorUtils - Setting SQL statement parameter value: column index 1, parameter value [hello], value class [java.lang.String], SQL type unknown
306289 [http-8084-1] DEBUG org.springframework.jdbc.datasource.DataSourceUtils - Returning JDBC Connection to DataSource
306289 [http-8084-1] INFO com.crimetrack.jdbc.JdbcOfficersDAO - Incorrect result size: expected 1, actual 0
306289 [http-8084-1] DEBUG org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver - Resolving exception from handler [com.crimetrack.web.OfficerRegistrationController@a32cdd]: java.lang.IllegalArgumentException: Invalid handler method return value: false
306289 [http-8084-1] DEBUG org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver - Resolving exception from handler [com.crimetrack.web.OfficerRegistrationController@a32cdd]: java.lang.IllegalArgumentException: Invalid handler method return value: false
306289 [http-8084-1] DEBUG org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver - Resolving exception from handler [com.crimetrack.web.OfficerRegistrationController@a32cdd]: java.lang.IllegalArgumentException: Invalid handler method return value: false
306290 [http-8084-1] DEBUG org.springframework.web.servlet.DispatcherServlet - Cleared thread-bound request context: org.apache.catalina.connector.RequestFacade@1cbab62
306290 [http-8084-1] DEBUG org.springframework.web.servlet.DispatcherServlet - Could not complete request
java.lang.IllegalArgumentException: Invalid handler method return value: false
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter$ServletHandlerMethodInvoker.getModelAndView(AnnotationMethodHandlerAdapter.java:971)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:438)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:424)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Unknown Source)
306290 [http-8084-1] DEBUG org.springframework.web.context.support.XmlWebApplicationContext - Publishing event in WebApplicationContext for namespace 'crimetrack-servlet': ServletRequestHandledEvent: url=[/crimeTrack/validateUserName.htm]; client=[127.0.0.1]; method=[GET]; servlet=[crimetrack]; session=[null]; user=[null]; time=[28ms]; status=[failed: java.lang.IllegalArgumentException: Invalid handler method return value: false]
306290 [http-8084-1] DEBUG org.springframework.web.context.support.XmlWebApplicationContext - Publishing event in Root WebApplicationContext: ServletRequestHandledEvent: url=[/crimeTrack/validateUserName.htm]; client=[127.0.0.1]; method=[GET]; servlet=[crimetrack]; session=[null]; user=[null]; time=[28ms]; status=[failed: java.lang.IllegalArgumentException: Invalid handler method return value: false]
OfficerRegistrationController
package com.crimetrack.web;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import org.apache.log4j.Logger;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.beans.propertyeditors.StringTrimmerEditor;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import com.crimetrack.business.Login;
import com.crimetrack.business.Officers;
import com.crimetrack.service.DivisionManager;
import com.crimetrack.service.GenderManager;
import com.crimetrack.service.OfficerRegistrationValidation;
import com.crimetrack.service.PositionManager;
import com.crimetrack.service.ValidateUserNameManager;
@Controller
public class OfficerRegistrationController {
private final Logger logger = Logger.getLogger(getClass());
private DivisionManager divisionManager;
private PositionManager positionManager;
private GenderManager genderManager;
private Officers officer = new Officers();
private ValidateUserNameManager validateUserNameManager;
Map<String, Object> myDivision = new HashMap<String, Object>();
Map<String, Object> myPosition = new HashMap<String, Object>();
Map<String, Object> myGender = new HashMap<String, Object>();
OfficerRegistrationValidation validateData = new OfficerRegistrationValidation();
@InitBinder("officers")
protected void initBinder(WebDataBinder binder){
//removes white spaces
binder.registerCustomEditor(String.class, new StringTrimmerEditor(true));
//formats date
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
//By passing true this will convert empty strings to null
binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));
dateFormat.setLenient(false);
binder.setValidator(new OfficerRegistrationValidation());
}
@RequestMapping(value="officer_registration.htm", method = RequestMethod.GET)
public ModelAndView loadPage(HttpServletRequest request,
HttpServletResponse response,@ModelAttribute Officers officer, BindingResult result, ModelMap m, Model model) throws Exception {
try{
logger.debug("In Http method for OfficerRegistrationController");
myDivision.put("divisionList", this.divisionManager.getDivisions());
myPosition.put("positionList", this.positionManager.getPositionList());
myGender.put("genderList", this.genderManager.getGenderList());
model.addAttribute("division", myDivision);
model.addAttribute("position", myPosition);
model.addAttribute("gender", myGender);
return new ModelAndView("officer_registration");
}catch(Exception e){
request.setAttribute("error",e.getMessage());
return new ModelAndView("error_page");
}
}
@RequestMapping(value="officer_registration.htm", method=RequestMethod.POST)
public ModelAndView handleRequest(@Valid @ModelAttribute Officers officer, BindingResult result, ModelMap m, Model model)throws Exception{
if(result.hasErrors()){
model.addAttribute("division", myDivision);
model.addAttribute("position", myPosition);
model.addAttribute("gender", myGender);
return new ModelAndView("officer_registration");
}else{
return null;
}
}
@RequestMapping(value="validateUserName.htm", method=RequestMethod.GET)
public boolean validateUserName(@RequestParam String userName, @ModelAttribute Officers officer, BindingResult result, ModelMap m)throws Exception{
try{
logger.debug("Inside Controller validateUserName");
logger.debug("The user name that came in is " + userName);
if (validateUserNameManager.DoesUserNameExist(userName)== true){
return true;
}
return false;
//return true;
}catch(Exception e){
logger.debug("Error in validateUserName Controller " + e.getMessage());
return false;
}
}
public void setDivisionManager(DivisionManager divisionManager){
this.divisionManager = divisionManager;
}
public void setPositionManager(PositionManager positionManager){
this.positionManager = positionManager;
}
public void setGenderManager(GenderManager genderManager){
this.genderManager = genderManager;
}
/**
* @return the validateUserNameManager
*/
public ValidateUserNameManager getValidateUserNameManager() {
return validateUserNameManager;
}
/**
* @param validateUserNameManager the validateUserNameManager to set
*/
public void setValidateUserNameManager(
ValidateUserNameManager validateUserNameManager) {
this.validateUserNameManager = validateUserNameManager;
}
/**
* @return the officer
*/
public Officers getOfficer() {
return officer;
}
/**
* @param officer the officer to set
*/
public void setOfficer(Officers officer) {
this.officer = officer;
}
}
Das Protokoll zeigt Fehler, ist der Wert, der zurückgegeben wird, durch die OfficerRegistrationController. Du solltest den code für die Klasse.
Gibson habe ich den Inhalt des Controllers. Ich bin nicht ganz sicher, ob ich den Aufruf des web-service richtig aus der jsp. Irgendwelche Ideen?
Gibson habe ich den Inhalt des Controllers. Ich bin nicht ganz sicher, ob ich den Aufruf des web-service richtig aus der jsp. Irgendwelche Ideen?
InformationsquelleAutor devdar | 2012-09-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Pro Feder
@RequestMapping
Dokumentation:Weil diese Methode hat den ModelAttribute annotation auf einem Führungskräfte-Objekt -, der return-Typ wird erwartet, dass eine Führungskräfte-Objekt.
Werden Sie wahrscheinlich wollen, dass diese Methode auf void zurück, und schreiben Sie an das response-Objekt selbst. (Um das zu tun, müssen Sie ein HttpServletResponse-parameter Ihrer Methode.)
Alternativ könnten Sie wieder eine JSON-view. Sehen Frühjahr: Rückkehr JSON vom controller als ModelAndVIew
Beispiel:
all i need to get zurückgegeben wird true, false. Ich Bemerke in meiner error logs ist nichts überholt zu diesem Punkt dbUserName = (String)getJdbcTemplate().queryForObject(sql, new Object[]{userName},String.class); ich bin nicht sicher, wenn ich den Wert aus dem resultset in "dbUserName" korrekt
Sobald Sie fixieren die ungültigen Rückgabetyp, dann erhalten Sie eine weitere Ausnahme, die sagen, es nicht finden können, ein Blick. Sie wollen wirklich, dass die controller-Methode auf void zurück, und schreiben Sie "true" oder "false", um die Antwort selbst. Sie können auch ein JSON anzeigen zu true oder false zurück, als ein JS primitiv, aber das wird wahrscheinlich noch einige weitere Konfiguration.
Auch (wenn Sie darauf bestehen auf der Rückkehr etwas) ich denke, es muss ein Boolean-Objekt, nicht eine primitive.
Sie brauchen, um wieder eine
MappingJacksonJsonView
anstatt der officer_registration anzeigen. Das Standardverhalten dieser Ansicht ist, zu konvertieren alle Ihre Modell-Attribute in JSON. Also...würden Sie brauchen nur ein Modell zu erstellen, mit einem einzigen "Daten" - Attribut mit dem Wert true oder false.InformationsquelleAutor Todd Gibson
Es scheint, Sie laufen diese Abfrage:
Die Abfrage erfolgreich ausgeführt, aber es ist kein Datensatz in der Tabelle passende
userName = 'hello'
, so wird ein leeres ResultSet zurückgegeben. Erstellen der officer dann nicht, weil es kein Offizier zu erstellen und diese Bedingung nicht behandelt wurde.Ausführen der Abfrage standalone und bestätigen, es gibt keine solche Aufzeichnung. Dann schauen Sie auf Ihrer mapping-code und sehen Sie, wie dieser Zustand sollte behandelt werden.
Follow-up - ... Die java-docs für JdbcTemplate.queryForObject Zustand:
Damit Sie diese sollte nicht aufgerufen werden, wenn Sie nicht sicher von einem Datensatz in der db, sonst die Zeile:
muss gewickelt werden, die mit einer try-catch-in diesem Fall behandeln.
FireBug Fehler ist: localhost:8084/crimeTrack/validateUserName.htm?userName=xzdc 500 Internal Server Error 63ms
Haben Sie bestätigen, dass Sie den Benutzernamen 'Hallo' ist in der Datenbank, und wenn es nicht ist, haben Sie versucht, die url mit einem Benutzernamen, der in der Datenbank? Wenn Sie ein ide sind, setzen Sie einen breakpoint auf die
queryForObject
Linie und sehen, ob das nicht die Ursache.ich habe nicht den Benutzernamen in der Datenbank, damit Ihr angenommen zu null zurückgeben, und die Funktion gibt false zurück, entweder in einer if...then...else-Bedingung oder Ausnahme. Ok werde ich tun, und gelangen zurück an Sie vielen Dank für Ihre Beratung so weit.
InformationsquelleAutor Glenn