mercredi 15 avril 2015

HDIV + Spring tag library (form) = Error, possible bug?

I'm finding troubles using HDIV with the tag Spring element: "< form:form >".


First, I'm going to explain the architecture of my application: I'm using Spring framework 4.1.6, Spring Security 4.0.0 and HDIV 2.1.10.


So far I'm not having errors during the development, nevertheless now I 've found one in a jsp file, when I'm using the form tag from Spring:



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


I obtained this error in the line 34: "



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



and more at.....(if it's necessary, I can provide it)


When I try the same code, but exchanging the tag "< form:form >" for the tag "< form >" It works.


When I examined in detail the code from HDIV:



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);
return result;
}


I wondered that maybe due to the fact that 'form:form' has a different structure than 'form', HDIV cannot find some parameters such as 'action', 'method'...But I'm not sure.


Also I attached my config files to provide more useful information (Java-based Config):


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://ift.tt/1EjlMDd

@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.class



@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 sweptDataSource;

@Autowired
private SweptSimpleAuthenticationProvider sweptAuthenticationProvider;

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

auth.authenticationProvider(sweptAuthenticationProvider);

}

@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 {}


Thank you in advance!!


Best Regards,


Alberto


Aucun commentaire:

Enregistrer un commentaire