2012-03-27 16 views
37

Estaba tratando de crear Hibernate Validator bean, y me encuentro con este problema creando un bean del método de fábrica estático en otra clase. Encontré una forma de Spring para inicializar mi bean Validator (solución en la parte inferior), pero el problema en sí no se resuelve. El validador se usa como ejemplo de caso aquí.Inicializando Spring bean del método estático de otra clase?

Éste es cómo crear la instancia de validación en Java

import javax.validation.Validation; 
import javax.validation.Validator; 
import javax.validation.ValidatorFactory; 

ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); 
Validator validator = factory.getValidator(); 

Así es como he tratado de crear el frijol en applicationContext.xml

<bean id="validatorFactory" 
    class="javax.validation.ValidatorFactory" 
    factory-method="javax.validation.Validation.buildDefaultValidatorFactory" /> 

<bean id="validator" 
    class="javax.validation.Validator" 
    factory-bean="validatorFactory" 
    factory-method="getValidator" /> 

Lo que entiendo es que en "fábrica método "solo se puede acceder a los métodos estáticos definidos en la clase definida en el parámetro" clase ". Desde el buildDefaultValidatorFactory() método es estático no puedo crear una instancia de validación y la doy como "fábrica de frijol" para el validatorFactory así:

<bean id="validation" class="javax.validation.Validation" /> 

<bean id="validatorFactory" 
    class="javax.validation.ValidatorFactory" 
    factory-bean="validation" 
    factory-method="buildDefaultValidatorFactory" /> 

Esto termina a error mensaje

" Compruebe que un método con el nombre especificado existe y que es no estático "

la pregunta es ¿cómo crear frijol en este tipo de situación en la primavera?

Esto es cómo he resuelto el problema de validación:

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

Respuesta

46

El factory-method sólo debe contener el nombre del método, sin incluir el nombre de la clase.

Si desea utilizar una fábrica estática, proporcione class de la fábrica (!) A la declaración de beans, si desea utilizar una fábrica de instancias, proporcione el factory-bean a la declaración de beans, pero no proporcione ambos : La clase del bean creado no se da en la declaración del bean.

Así un ejemplo completo debe tener este aspecto, el uso de una fábrica estática para validatorFactory y una fábrica de instancia para validator:

<bean id="validatorFactory" 
    class="javax.validation.Validation" 
    factory-method="buildDefaultValidatorFactory" /> 

<bean id="validator" 
    factory-bean="validatorFactory" 
    factory-method="getValidator" /> 

Ver detalles en la documentación:

http://static.springsource.org/spring/docs/2.0.x/reference/beans.html#beans-factory-class-static-factory-method

Para responder usted pregunta - ¿Cómo crearías frijol en este tipo de situación en primavera? - Hazlo exactamente como se muestra aquí, o si puedes, utiliza una clase de utilidad como LocalValidatorFactoryBean, que simplifica la configuración de Spring.

+0

Nombre de la clase es para demostrar lo que quería hacer. Como dije "Lo que entiendo es que en" método de fábrica "solo se puede acceder a métodos estáticos definidos en la clase definida en el parámetro" clase "." – Spaideri

+0

Eso es correcto: si proporciona el parámetro 'clase ', el método de fábrica debe ser un método estático de esa clase, como se ve en la creación de' validatorFactory'. –

0

¿Has probado esto?

<bean id="validatorFactory" 
class="javax.validation.Validation" 
factory-method="buildDefaultValidatorFactory" /> 

<bean id="validator" 
class="javax.validation.Validator" 
factory-bean="validatorFactory" 
factory-method="getValidator" /> 
+2

¡Hola!El método buildDefaultValidatorFactory es un método estático de Class javax.validation.Validation – Spaideri

Cuestiones relacionadas