【问题标题】:Spring MVC @Valid annotation in contoller class causes glassfish server to throw an exception控制器类中的 Spring MVC @Valid 注解导致 glassfish 服务器抛出异常
【发布时间】: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


【解决方案1】:

我已经包含了 jars validation-api-1.0.0.GA.jar, hibernate-validator-annotation-processor-4.1.0.Final.jar 通过右键单击您的项目,选择“属性”

转到“库”,选项卡“处理器”。

【讨论】:

    猜你喜欢
    • 2015-01-15
    • 1970-01-01
    • 1970-01-01
    • 2012-11-04
    • 1970-01-01
    • 1970-01-01
    • 2018-11-11
    • 2016-07-22
    • 2013-11-20
    相关资源
    最近更新 更多