【发布时间】:2017-03-14 09:58:08
【问题描述】:
我在 netbeans 8.2 中创建了 SpringMVC 项目。控制器类如图:
@Controller
public class FormController {
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.setAllowedFields(new String[] {
"userName", "password", "confirmPassword", "firstName",
"lastName", "email", "Marketing", "legalConfirmation","myAddress" });
}
@RequestMapping(value="new",method= RequestMethod.GET)
public String handleregistration(Model model){
model.addAttribute("userdatabean",new UserDetails());
return "Registration";
}
@RequestMapping(value="Registration",method=RequestMethod.POST)
public ModelAndView Gatherdata(@Valid
@ModelAttribute("userdatabean")UserDetails
data,BindingResult error,ModelMap modelmap)throws Exception{
if(error.hasErrors()){
ModelAndView modelerror=new ModelAndView("Registration");
return modelerror;
}
ModelAndView dataModel=new ModelAndView("success");
dataModel.addObject("registration", data);
return dataModel;
}
}
Form注册如下图:
%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>User Registration</title>
<style>
.error{
color: red; font-weight: bold;
}
</style>
</head>
<body>
<form:form action="Registration" modelAttribute="userdatabean" >
<h1>New user Registration</h1>
<div>UserName: <form:input path="userName"/>
<form:errors path="userName" cssClass="error"/>
</div>
<div> Email: <form:input path="email"/>
<form:errors path="email" cssClass="error"/>
</div>
<div> Address:<form:input path="myAddress.StreetName"/>
<form:errors path="myAddress.StreetName" cssClass="error"/>
</div>
<div> first Name: <form:input path="firstName"/>
<form:errors path="firstName" cssClass="error"/>
</div>
<div> Last Name: <form:input path="lastName"/>
<form:errors path="lastName" cssClass="error"/>
</div>
<div> Password:<form:password path="Password"/>
<form:errors path="Password" cssClass="error"/>
</div>
<div> Confirm Password:<form:password path="confirmPassword"/>
<form:errors path="confirmPassword" cssClass="error"/>
</div>
<div><form:checkbox id="Marketing" path="Marketing"/>Please send
me information via email
<form:errors path="Marketing" cssClass="error"></form:errors>
</div>
<div><form:checkbox id="legalConfirmation"
path="legalConfirmation"/>I accept the terms of use
<form:errors path="legalConfirmation" cssClass="error"/>
</div>
<div><input type="submit" value="Register"/></div>
</form:form>
</body>
</html>
UserDetails 类
@Component @ScriptAssert(lang="javascript",script="_this.confirmPassword.equals(_this.Password)",message="password mismatch")
public class UserDetails {
private String userName,Password,email,firstName,lastName,confirmPassword;
private Address myAddress;
private boolean legalConfirmation=false;
private boolean Marketing=true;
@NotNull
@Size(min=2,max=20,message="Username has to be between 2-20")
public String getUserName(){
return this.userName;
}
public void setUserName(String UserName){
this.userName=UserName;
}
@NotNull
@Size(min=8,max=100,message="password must be between 8-100")
public String getPassword(){
return this.Password;
}
public void setPassword(String Password){
this.Password=Password;
}
@Email(message="the email must be a real address")
public String getEmail(){
return this.email;
}
public void setEmail(String Email){
this.email=Email;
}
@NotNull
@Size(min=1,max=20,message="first name must be between 1-20")
public String getFirstName(){
return this.firstName;
}
public void setFirstName(String firstName){
this.firstName=firstName;
}
@NotNull
@Size(min=1,max=20,message="Last name can only be between 1-20")
public String getLastName(){
return this.lastName;
}
public void setLastName(String LastName){
this.lastName=LastName;
}
@NotNull
@Size(min=8,max=100,message="Confirm password must match password")
public String getConfirmPassword(){
return this.confirmPassword;
}
public void setConfirmPassword(String Confirm){
this.confirmPassword=Confirm;
}
public void setMarketing(boolean ok){
this.Marketing=ok;
}
public boolean getMarketing(){
return this.Marketing;
}
public void setLegalConfirmation(boolean legal){
this.legalConfirmation=legal;
}
@AssertTrue(message="You must check the terms and conditions")
public boolean getLegalConfirmation(){
return this.legalConfirmation;
}
public Address getMyAddress(){
return this.myAddress;
}
public void setMyAddress(Address MyAddress){
this.myAddress=MyAddress;
}
}
成功页面如下:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Registration Successful</title>
</head>
<body>
<h4>successful registration of user</h4>
<table>
<tr>
<td>
Student Username:
</td>
<td>${registration.userName}</td>
</tr>
<tr>
<td>
Student last name:
</td>
<td>${registration.lastName}</td>
</tr>
<tr>
<td>
Student first name:
</td>
<td>${registration.firstName}</td>
</tr>
<tr>
<td>
Student email:
</td>
<td>${registration.email}</td>
</tr>
<tr>
<td>
Student address:
</td>
<td>${registration.myAddress.StreetName}</td>
</tr>
</table>
</body>
</html>
[名称]-servlet.xml
<?xml version='1.0' encoding='UTF-8' ?>
<!-- was: <?xml version="1.0" encoding="UTF-8"?> -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org
/schema/tx/spring-tx-4.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<mvc:annotation-driven />
<context:component-scan base-package="com.Ricko.Controller"/>
</beans>
问题是当我向我的 Contoller 类添加 @Valid 注释时,Glassfish 服务器会抛出异常,而不管我输入的输入是否有效。如果没有 @Valid 注释,代码运行时不会出现任何错误。我正在使用弹簧版本 4.0.1。 抛出的异常如下图: 警告:StandardWrapperValve[dispatcher]: Servlet.service() for servlet
dispatcher threw exception
java.lang.StringIndexOutOfBoundsException: String index out of range: -1
at org.springframework.validation.
AbstractErrors.isMatchingFieldError(AbstractErrors.java:236)
at org.springframework.validation.AbstractBindingResult.
getFieldError(AbstractBindingResult.java:216)
at org.springframework.validation.beanvalidation.
SpringValidatorAdapter.processConstraintViolations
(SpringValidatorAdapter.
java:122)
g.springframework.validation.beanvalidation.SpringValidatorAdapter.
validate(SpringValidatorAdapter.java:108)
g.springframework.validation.DataBinder.validate(DataBinder.java:760)
at
org.springframework.web.method.annotation.ModelAttributeMethodProcessor
.validateIfApplicable(ModelAttributeMethodProcessor.java:161)
at org.springframework.web.method.annotation.
ModelAttributeMethodProcessor
.resolveArgument(ModelAttributeMethodProcessor.java:109)
org.springframework.web.method.support.
HandlerMethodArgumentResolverComposite.resolveArgument
(HandlerMethodArgumentResolverComposite.java:79)
at org.springframework.web.method.support.
InvocableHandlerMethod.getMethodArgumentValues
(InvocableHandlerMethod.java:157)
at org.springframework.web.method.support.
InvocableHandlerMethod.invokeForRequest
(InvocableHandlerMethod.java:124)
at org.springframework.web.servlet.mvc.method.annotation.
ServletInvocableHandlerMethod.invokeAndHandle
(ServletInvocableHandlerMethod.java:104)
at org.springframework.web.servlet.mvc.method.annotation.
RequestMappingHandlerAdapter.invokeHandleMethod
(RequestMappingHandlerAdapter.java:749)
at org.springframework.web.servlet.mvc.method.annotation.
RequestMappingHandlerAdapter.handleInternal
(RequestMappingHandlerAdapter.java:690)
at org.springframework.web.servlet.mvc.method.
AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83)
at org.springframework.web.servlet.DispatcherServlet.
doDispatch(DispatcherServlet.java:945)
at org.springframework.web.servlet.DispatcherServlet.
doService(DispatcherServlet.java:876)
at org.springframework.web.servlet.FrameworkServlet.
processRequest(FrameworkServlet.java:961)
at org.springframework.web.servlet.FrameworkServlet.doPost
(FrameworkServlet.java:863)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
at org.springframework.web.servlet.FrameworkServlet.
service(FrameworkServlet.java:837)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at org.apache.catalina.core.StandardWrapper.service
(StandardWrapper.java:1682)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter
(ApplicationFilterChain.java:344)
at org.apache.catalina.core.ApplicationFilterChain.
doFilter(ApplicationFilterChain.java:214)
at org.glassfish.tyrus.servlet.TyrusServletFilter.
doFilter(TyrusServletFilter.java:305)
at org.apache.catalina.core.ApplicationFilterChain.
internalDoFilter(ApplicationFilterChain.java:256)
at org.apache.catalina.core.ApplicationFilterChain.
doFilter(ApplicationFilterChain.java:214)
at org.apache.catalina.core.StandardWrapperValve.
invoke(StandardWrapperValve.java:316)
at org.apache.catalina.core.StandardContextValve.
invoke(StandardContextValve.java:160)
at org.apache.catalina.core.StandardPipeline.
doInvoke(StandardPipeline.java:734)
at org.apache.catalina.core.StandardPipeline.
invoke(StandardPipeline.java:673)
at com.sun.enterprise.web.WebPipeline.
invoke(WebPipeline.java:99)
at org.apache.catalina.core.StandardHostValve.
invoke(StandardHostValve.java:174)
at org.apache.catalina.connector.CoyoteAdapter.
doService(CoyoteAdapter.java:416)
at org.apache.catalina.connector.CoyoteAdapter.
service(CoyoteAdapter.java:283)
at com.sun.enterprise.v3.services.impl.
ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:459)
at com.sun.enterprise.v3.services.impl.ContainerMapper.
service(ContainerMapper.java:167)
at org.glassfish.grizzly.http.server.HttpHandler.
runService(HttpHandler.java:206)
at org.glassfish.grizzly.http.server.HttpHandler.
doHandle(HttpHandler.java:180)
at org.glassfish.grizzly.http.server.HttpServerFilter.
handleRead(HttpServerFilter.java:235)
at org.glassfish.grizzly.filterchain.ExecutorResolver$9.
execute(ExecutorResolver.java:119)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.
executeFilter(DefaultFilterChain.java:283)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.
executeChainPart(DefaultFilterChain.java:200)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.
execute(DefaultFilterChain.java:132)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.
process(DefaultFilterChain.java:111)
at org.glassfish.grizzly.ProcessorExecutor.
execute(ProcessorExecutor.java:77)
at org.glassfish.grizzly.nio.transport.TCPNIOTransport.
fireIOEvent(TCPNIOTransport.java:536)
at org.glassfish.grizzly.strategies.AbstractIOStrategy.
fireIOEvent(AbstractIOStrategy.java:112)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.
run0(WorkerThreadIOStrategy.java:117)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.
access$100(WorkerThreadIOStrategy.java:56)
at org.glassfish.grizzly.strategies.
WorkerThreadIOStrategy$WorkerThreadRunnable.
run(WorkerThreadIOStrategy.java:137)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.
doWork(AbstractThreadPool.java:591)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.
run(AbstractThreadPool.java:571)
at java.lang.Thread.run(Thread.java:745)
当我输入相同的合法参数而没有 @Valid 注释时,不会引发异常。把它插回去,它会抛出。请协助解决。我正在学习框架,所以可能不太擅长。
【问题讨论】:
-
然后你转储了所有代码,但忘记了实际异常的重要部分......
-
消息:内部服务器错误
-
描述:服务器遇到内部错误,导致无法完成此请求。异常 org.springframework.web.util.NestedServletException:请求处理失败;嵌套异常是 java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:-1 根本原因 java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:-1
-
类型异常报告消息内部服务器错误描述服务器遇到一个内部错误,阻止它完成此请求。异常 org.springframework.web.util.NestedServletException:请求处理失败;嵌套异常是 java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:-1 根本原因 java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:-1 注意 GlassFish 中提供了异常的完整堆栈跟踪及其根本原因服务器开源版 4.1.1 日志。
-
请编辑您的问题和格式,不要添加为 cmets,因为这会使其不可读。
标签: java spring validation spring-mvc glassfish