2015-04-15 31 views
0

我使用標籤Spring元素使用HDIV發現問題:「< form:form>」。首先,我將解釋我的應用程序的體系結構: 我使用的是Spring框架4.1.6,Spring Security 4.0.0和HDIV 2.1.10。HDIV + Spring標記庫(form)=錯誤,可能的錯誤?

到目前爲止,我沒有發育過程中有錯誤,不過現在我已經找到了一個在JSP文件中,當我使用spring表單標籤:

   <form:form 
         action="${pageContext.servletContext.contextPath}/newUser" 
        method="POST" class="form-horizontal" commandName="user"> 

我得到這個錯誤在管線34: 「<形式:形式」

顯示java.lang.NullPointerException在 org.hdiv.web.servlet.support.HdivRequestDataValueProcessor.processAction(HdivRequestDataValueProcessor.java:122) 在 org.springframework 。 web.servlet.tags.form.FormTag.processAction(FormTag.java:479) 在 org.springframework.web.servlet.tags.form.FormTag.resolveAction(FormTag.java:433) 在 org.springframework。 web.servlet.tags.form.FormTag.writeTagContent(FormTag.java:349) 在 org.springframework.web.servlet.tags.form.AbstractFormTag.doStartTagInternal(AbstractFormTag.java:84) 在 org.springframework。 web.servlet.tags.RequestContextAwareTag.doStartTag(RequestContextAwareTag.java:80) 在 org.apache.jsp.WEB_002dINF.jsp.newUser_jsp._jspx_meth_form_005fform_005f0(newUser_jsp.java:197) 在 org.apache.jsp.WEB_002dINF。 jsp.newUser_jsp._jspService(newUser_ jsp.java:137) 在org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) 在javax.servlet.http.HttpServlet.service(HttpServlet.java:729)

(如果有必要,我可以提供)

當我嘗試使用相同的代碼,但爲標籤「< form>交換標籤」< form:form>「時作品。

當我詳細檢查從HDIV的代碼:

HdivRequestDataValueProcessor.class

public class HdivRequestDataValueProcessor implements RequestDataValueProcessor 

protected LinkUrlProcessor linkUrlProcessor; 

protected FormUrlProcessor formUrlProcessor; 

     if (this.innerRequestDataValueProcessor != null) { 
     String processedAction = this.innerRequestDataValueProcessor.processAction(request, action, method); 
     if (processedAction != action) { 
      action = processedAction; 
     } 
    } 

    String result = this.formUrlProcessor.processUrl(request, action, method);//line 122 
    return result; 
} 

我想知道,也許由於這樣的事實:「形式:表格」具有不同的結構'form',HDIV找不到'action','method'等參數......但我不確定。

我也附上了我的配置文件,以提供更多有用的信息(基於Java的配置):

WebApplicationInit.class

import javax.servlet.Filter; 
import javax.servlet.ServletContext; 

import org.hdiv.filter.ValidatorFilter; 
import org.hdiv.listener.InitListener; 
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; 

public class WebApplicationInit extends 
    AbstractAnnotationConfigDispatcherServletInitializer { 
// http://www.robinhowlett.com/blog/2013/02/13/spring-app-migration-from-xml-to-java-based-config/ 

@Override 
protected Class<?>[] getRootConfigClasses() { 
    return new Class[] { RootConfig.class, DatabaseConfig.class, 
      SecurityConfig.class, HdivSecurityConfig.class }; 
    // , HdivSecurityConfig.class 
} 

@Override 
protected Class<?>[] getServletConfigClasses() { 
    return new Class[] { MvcConfig.class }; 
} 

@Override 
protected String[] getServletMappings() { 
    return new String[] { "/" }; 
} 

//web.xml filter 
@Override 
protected Filter[] getServletFilters(){ 
    return new Filter[] { new ValidatorFilter()}; 

} 

// web.xml listener 
@Override 
protected void registerDispatcherServlet(ServletContext servletContext) { 
    super.registerDispatcherServlet(servletContext); 
    servletContext.addListener(InitListener.class); 
} 
} 

HdivSecurityConfig。類

@Configuration 
@EnableHdivWebSecurity 
public class HdivSecurityConfig extends HdivWebSecurityConfigurerAdapter { 

@Override 
public void addExclusions(ExclusionRegistry registry) { 

    registry.addUrlExclusions("/login").method("GET"); 

    registry.addUrlExclusions("/newUser").method("GET"); 
    registry.addUrlExclusions("/newUser").method("POST"); 

    registry.addUrlExclusions("/about").method("GET"); 

    registry.addUrlExclusions("/resources/.*").method("GET"); 
    registry.addUrlExclusions("/bst-lib/.*").method("GET"); 
    registry.addUrlExclusions("/images/.*").method("GET"); 
} 

@Override 
public void configure(SecurityConfigBuilder builder) { 

    //the session has expired, go to login again 
    builder.sessionExpired().homePage("/").loginPage("/login"); 
    //Execution strategy 
    builder.strategy(Strategy.CIPHER); 
    //error page 
    builder.errorPage("/error"); 
    } 
} 

SecurityConfig.class

@EnableWebSecurity 
public class SecurityConfig extends WebSecurityConfigurerAdapter { 

@Autowired 
private DriverManagerDataSource myWebAppDataSource; 

@Autowired 
private MyWebAppSimpleAuthenticationProvider myWebAppAuthenticationProvider; 

@Autowired 
public void configureGlobal(AuthenticationManagerBuilder auth) 
     throws Exception { 

    auth.authenticationProvider(myWebAppAuthenticationProvider); 

} 

@Override 
protected void configure(HttpSecurity http) throws Exception { 

    http.authorizeRequests() 
      .antMatchers("/resources/**", "/bst-lib/**", "/images/**", 
        "/about", "/newUser").permitAll().anyRequest() 
      .authenticated().and().formLogin().loginPage("/login") 
      .permitAll(); 

} 

}

SecurityWebApplicationInit.class

public class SecurityWebApplicationInit extends 
    AbstractSecurityWebApplicationInitializer {} 

預先感謝您!

最好的問候,

阿爾貝託

----編輯---

按照給定的例子,這是我現在的代碼:

WebApplicationInit.class

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; 

public class WebApplicationInit extends 
    AbstractAnnotationConfigDispatcherServletInitializer { 
// http://www.robinhowlett.com/blog/2013/02/13/spring-app-migration-from-xml-to-java-based-config/ 

@Override 
protected Class<?>[] getRootConfigClasses() { 
    return new Class[] { RootConfig.class, DatabaseConfig.class, 
      SecurityConfig.class, HdivSecurityConfig.class }; 
} 

@Override 
protected Class<?>[] getServletConfigClasses() { 
    return new Class[] { MvcConfig.class }; 
} 

@Override 
protected String[] getServletMappings() { 
    return new String[] { "/" }; 
} 

@Override 
protected String getServletName(){ 
    return "myDispatcher"; 

    } 
} 

HDIVSecurityConfig.class

import org.hdiv.config.Strategy; 
import org.hdiv.config.annotation.EnableHdivWebSecurity; 
import org.hdiv.config.annotation.ExclusionRegistry; 
import org.hdiv.config.annotation.RuleRegistry; 
import org.hdiv.config.annotation.ValidationConfigurer; 
import org.hdiv.config.annotation.builders.SecurityConfigBuilder; 
import org.hdiv.config.annotation.configuration.HdivWebSecurityConfigurerAdapter; 
import org.springframework.context.annotation.Configuration; 

@Configuration 
@EnableHdivWebSecurity 
public class HdivSecurityConfig extends HdivWebSecurityConfigurerAdapter { 

@Override 
public void addExclusions(ExclusionRegistry registry) { 

    registry.addUrlExclusions("/login").method("GET"); 
    registry.addUrlExclusions("/newUser").method("GET"); 
    registry.addUrlExclusions("/newUser").method("POST"); 
    registry.addUrlExclusions("/about").method("GET"); 
    registry.addUrlExclusions("/resources/.*").method("GET"); 
    registry.addUrlExclusions("/bst-lib/.*").method("GET"); 
    registry.addUrlExclusions("/images/.*").method("GET"); 
    registry.addParamExclusions("_csrf"); 
} 

@Override 
public void configure(SecurityConfigBuilder builder) { 

    // the session has expired, go to login again 
    builder.sessionExpired().homePage("/").loginPage("/login"); 
    // Execution strategy 
    builder.strategy(Strategy.MEMORY); 
    builder.maxPagesPerSession(5); 
    // error page 
    builder.errorPage("/error"); 
} 

@Override 
public void addRules(RuleRegistry registry) { 

    //registry.addRule("safeText").acceptedPattern("^[[email protected]\\-_]*$"); 
} 

@Override 
public void configureEditableValidation(
     ValidationConfigurer validationConfigurer) { 

    validationConfigurer.addValidation("/.*"); 
    } 
} 

的web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee  http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" 
id="WebApp_ID" version="3.1"> 
<display-name>myWebApp</display-name> 

<listener> 
    <listener-class>org.hdiv.listener.InitListener</listener-class> 
</listener> 

<!-- HDIV Validator Filter --> 
<filter> 
    <filter-name>ValidatorFilter</filter-name> 
    <filter-class>org.hdiv.filter.ValidatorFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>ValidatorFilter</filter-name> 
    <servlet-name>myDispatcher</servlet-name> 
</filter-mapping> 

<jsp-config> 
    <taglib> 
     <taglib-uri>http://java.sun.com/jsp/jstl/core</taglib-uri> 
     <taglib-location>/WEB-INF/tlds/hdiv-c.tld</taglib-location> 
    </taglib> 
</jsp-config> 
</web-app> 

newUser.jsp

<form:form 
       action="${pageContext.servletContext.contextPath}/newUser" 
       method="POST" class="form-horizontal" commandName="user"> 

       <div class="form-group"> 
        <label for="inputName" 
         class="col-sm-offset-2 col-sm-2 control-label">Name:</label> 
        <div class="col-sm-6"> 
         <form:input class="form-control" id="inputName" 
          placeholder="Name" path="name" /> 
        </div> 
       </div> 

       <div class="form-group"> 
        <label for="inputSurname" 
         class="col-sm-offset-2 col-sm-2 control-label">Surname:</label> 
        <div class="col-sm-6"> 
         <form:input class="form-control" id="inputSurname" 
          placeholder="Surname" path="surname" /> 
        </div> 
       </div> 

       <div class="form-group"> 
        <label for="inputOrganisation" 
         class="col-sm-offset-2 col-sm-2 control-label">Organization:</label> 
        <div class="col-sm-6"> 
         <form:input class="form-control" id="inputOrganisation" 
          placeholder="Organization" path="organization" /> 
        </div> 
       </div> 

       <div class="form-group"> 
        <label for="inputEmail" 
         class="col-sm-offset-2 col-sm-2 control-label">Email:</label> 
        <div class="col-sm-6"> 
         <form:input type="email" class="form-control" id="inputEmail" 
          placeholder="Email" path="email" /> 
        </div> 
       </div> 

       <div class="form-group"> 
        <label for="inputPassword" 
         class="col-sm-offset-2 col-sm-2 control-label">Password:</label> 
        <div class="col-sm-6"> 
         <form:password class="form-control" id="inputPassword" 
          placeholder="Password" path="password" /> 
        </div> 
       </div> 

       <div class="form-group"> 
        <label for="inputRPassword" 
         class="col-sm-offset-2 col-sm-2 control-label">Repeat 
         Password:</label> 
        <div class="col-sm-6"> 
         <form:password class="form-control" id="inputRPassword" 
          placeholder="Repeat Password" path="rPassword" /> 
        </div> 
       </div> 

       <div class="col-sm-offset-4 col-sm-8"> 
        <button type="submit" class="btn btn-default login-button">Sing 
         in</button> 
        <button type="button" class="btn btn-default login-button" 
         onclick="clearAll()">Clear All</button> 
        <button type="button" class="btn btn-default login-button" 
         onclick="comeBack()">Come Back</button> 
       </div> 

       <input type="hidden" name="${_csrf.parameterName}" 
        value="${_csrf.token}" /> 
      </form:form> 

MvcConfig.class

@Configuration 
@EnableWebMvc 
@ComponentScan(basePackages = { "com.ec.myWebApp" }) 
public class MvcConfig extends WebMvcConfigurerAdapter { 

@Autowired 
/* 
* If I use this commented line, The application fails due to the fact that the bean "hdivEditableValidator" can't be found...If I don't use the tag "Qualifier" it does not fail 
*/ 
// @Qualifier("hdivEditableValidator") 
private Validator hdivEditableValidator; 


// View Name -> View 
@Bean 
public InternalResourceViewResolver getViewResolver() { 
    InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); 
    viewResolver.setViewClass(JstlView.class); 
    viewResolver.setPrefix("/WEB-INF/jsp/"); 
    viewResolver.setSuffix(".jsp"); 
    return viewResolver; 
} 

// static resources 
@Override 
public void addResourceHandlers(ResourceHandlerRegistry registry) { 
    registry.addResourceHandler("/resources/**").addResourceLocations(
      "/public-resources/"); 

    registry.addResourceHandler("/bst-lib/**").addResourceLocations(
      "/public-resources/lib/bootstrap-3.3.2-dist/"); 

    registry.addResourceHandler("/images/**").addResourceLocations(
      "/public-resources/images/"); 
} 

@Bean 
public MultipartResolver multipartResolver() { 
    HdivCommonsMultipartResolver resolver = new HdivCommonsMultipartResolver(); 
    resolver.setMaxUploadSize(100000); 
    return resolver; 
} 

@Override 
public Validator getValidator() { 
    return hdivEditableValidator; 
} 

}

我改爲HDIV添加到我的Web應用程序的方式,在XML文件中添加它,而不是做,在使用基於Java的配置。另外,我使用示例添加了Qualifier標記(MvcConfig.class),但在使用它時它不起作用...(它找不到bean ...)。 空的錯誤並沒有消失......

+0

如果您使用'form'而不是'form:form' hdiv沒有被使用,那麼就沒有錯誤。試着弄清楚是什麼導致了'NullPointerException',需要的東西可能是'null'。 –

+0

當我調試代碼時,發現問題在於HdivRequestDataValueProcessor類中的以下內容。 ** linkUrlProcessor和formUrlProcessor爲null ** – 4LB3R70

+0

我無法想象null值的原因是什麼。這是一個使用JavaConfig和HDIV 2.1.10的Spring mvc應用程序。 https://github.com/hdiv/hdiv-spring-mvc-showcase/tree/javaconfig也許可以幫助! – gillarramendi

回答

0

的問題已經解決改變這一行:

@ComponentScan(basePackages = { "com.ec.myWebApp" }) 

在類:MvcConfing,對於這個:

@ComponentScan(basePackages = { "com.ec.myWebApp.controllers", 
    "com.ec.myWebApp.dao", "com.ec.myWebApp.services" }) 

我原線在上下文創建過程中首先掃描兩次HDIV配置類,第二次掃描由「@ComponentScan」掃描。這給了一個不正確的初始化。所以,配置包使用了兩次,而不是一次。

謝謝。