2017-10-01 9 views
0

私は、注釈とConstraintValidatorインタフェースを使用してカスタムBean検証を作成しようとしています。モデルの名前をユニークにすることを目的としています。 理由はわかりませんが、製品を追加するためにフォームを送信するときにNullPointerExceptionがスローされます。Spring HibernateカスタムBeanの検証 - NullPointerException

java.lang.NullPointerException 
pl.dsdev.validator.UniqueNameValidator.isValid(UniqueNameValidator.java:20) 

Modelクラス:

@Entity 
public class Product { 

@Id 
@GeneratedValue 
private long id; 

@NotNull(message = "Name is required") 
@Size.List({@Size(min = 3, message = "must be longer than {min} characters"), @Size(max = 25, message = "must be shorter than {max} characters")}) 
@UniqueName(message = "This name is used by another product.") 
private String name; 

注釈インタフェース:ConstraintValidatorの

@Target(ElementType.FIELD) 
@Retention(RetentionPolicy.RUNTIME) 
@Constraint(validatedBy = UniqueNameValidator.class) 
public @interface UniqueName { 

String message() default ""; 

Class<?>[] groups() default {}; 

Class<? extends Payload>[] payload() default {}; 
} 

実装:

public class UniqueNameValidator implements ConstraintValidator<UniqueName, String> { 

@Autowired 
private ProductService productService; 

public void initialize(UniqueName uniqueName) { 

} 

public boolean isValid(String name, ConstraintValidatorContext constraintValidatorContext) { 
    return productService.findByName(name)==null; 
} 

public ProductService getProductService() { 
    return productService; 
} 

public void setProductService(ProductService productService) { 
    this.productService = productService; 
} 
} 

マイルート-context.xmlファイル:

<?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:context="http://www.springframework.org/schema/context" 
    xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:tx="http://www.springframework.org/schema/tx" 
    xmlns:p="http://www.springframework.org/schema/p" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> 

<context:component-scan base-package="pl.dsdev" /> 
<mvc:annotation-driven /> 

<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory --> 
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name="prefix" value="/WEB-INF/views/" /> 
    <property name="suffix" value=".jsp" /> 
</bean> 


<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
    <property name="url" value="jdbc:mysql://localhost:3306/springbaza" /> 
    <property name="username" value="tutorial" /> 
    <property name="password" value="password" /> 
</bean> 

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="packagesToScan" value="pl.dsdev.model" /> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" /> 
    </property> 
    <property name="jpaProperties"> 
     <props> 
      <prop key="hibernate.hbm2ddl.auto">create</prop> 
      <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop> 
      <prop key="hibernate.show_sql">true</prop> 

     </props> 
    </property> 
</bean> 

<tx:annotation-driven /> 
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="entityManagerFactory" /> 
</bean> 

<bean id="persistenceExceptionTranslationPostProcessor" class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" /> 

<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> 
    <property name="basename" value="validation"/> 
</bean> 

<bean id="validator" 
     class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/> 

答えて

1

あなたproductServiceが(これはあなたが取得しているNPEを説明します)、スプリングによって注入されていないように見えます。

spring bean validationが誤って構成されているか、まったく構成されていません。

+0

'ProductService'のコードを投稿できますか?有効なSpring Beanではないかもしれません。 – breezee

+0

Spring Beanの設定ファイルを追加しました。何か不足していないか確認できますか? – Donios

関連する問題