0

タグ Spring 要素 "< form:form >" を使用して HDIV を使用すると問題が発生します。

まず、アプリケーションのアーキテクチャについて説明します。Spring フレームワーク 4.1.6、Spring Security 4.0.0、および HDIV 2.1.10 を使用しています。

これまでのところ、開発中にエラーは発生していませんが、Spring のフォーム タグを使用しているときに、jsp ファイルにエラーが見つかりました。

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

34 行目でこのエラーを取得しました: "< form:form "

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) 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. org.springframework.web.servlet.tags.RequestContextAwareTag.doStartTag(RequestContextAwareTag.java:80) の web.servlet.tags.form.AbstractFormTag.doStartTagInternal(AbstractFormTag.java:84) 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)

and more at.....(必要であれば提供できます)

同じコードを試してみると、タグ「< 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:form' は '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.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 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("^[a-zA-Z0-9@.\\-_]*$");
}

@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 アプリケーションに追加する方法を変更し、java ベースの構成を使用する代わりに、xml ファイルに追加しました。さらに、サンプルを使用してQualifierタグ(MvcConfig.class)を追加しましたが、使用すると機能しません...(Beanが見つからない...)。nullエラーは消えていません...

4

1 に答える 1

0

この行を変更すると、問題は解決されました。

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

クラスで: MvcConfing、このため:

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

私の元の行は、HDIV 構成クラスを 2 回スキャンしました。最初はコンテキストの作成中に、2 回目は "@ComponentScan" によってスキャンされました。これにより、不適切な初期化が行われました。そのため、構成パッケージは 1 回ではなく 2 回使用されました。

ありがとうございました。

于 2015-04-27T07:17:00.357 に答える