Fj-28 exec 8.2

Boa tarde Pessoal,

Estou precisando de ajuda para terminar o exec 8.2 item:9 da apostila FJ28

Obs: estava funcionando até entrar na parte de Refatorando os Daos.

Segue o erro:

http://localhost:8080/goodbuy/produtos/formulario

root cause

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name ‘produtoDao’: Unsatisfied dependency expressed through constructor argument with index 0 of type [org.hibernate.Session]: : Error creating bean with name ‘br.com.caelum.goodbuy.infra.CriadorDeSession’: FactoryBean threw exception on object creation; nested exception is java.lang.NullPointerException; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘br.com.caelum.goodbuy.infra.CriadorDeSession’: FactoryBean threw exception on object creation; nested exception is java.lang.NullPointerException
org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:730)
org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:196)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1003)

Classes:

package br.com.caelum.goodbuy.dao;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.Transaction;

import br.com.caelum.goodbuy.infra.CriadorDeSession;
import br.com.caelum.goodbuy.modelo.Produto;
import br.com.caelum.vraptor.ioc.Component;

//endica que esta classe é uma dependencia e pode
//ser instanciada pelo Vraptor

@Component
public class ProdutoDao {

//classe responsavel por encapsular as 
//chamadas do Hibernate

private final Session session;

public ProdutoDao(Session session){
	this.session = session;
}

public void salva(Produto produto) {
	
	Transaction tx = session.beginTransaction();
	session.save(produto);
	tx.commit();
}
@SuppressWarnings("unchecked")
public List<Produto>listaTudo(){
	return this.session.createCriteria(Produto.class).list();
}

//carrega do banco o id de entrada do parametro
public Produto carrega(Long id){
	return (Produto)this.session.load(Produto.class, id);
}

public void atualiza(Produto produto){
	Transaction tx=session.beginTransaction();
	this.session.update(produto);
	tx.commit();
}

public void remove(Produto produto){
	Transaction tx = session.beginTransaction();
	this.session.delete(produto);
	tx.commit();
}

}


package br.com.caelum.goodbuy.infra;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;

import br.com.caelum.vraptor.ioc.Component;
import br.com.caelum.vraptor.ioc.ComponentFactory;

@Component
public class CriadorDeSessionFactory implements ComponentFactory{

public static final Session Produto = null;

public SessionFactory getInstance() {
	AnnotationConfiguration configuration = new AnnotationConfiguration();
	configuration.configure();
	SessionFactory factory=configuration.buildSessionFactory();
	return factory;
}

}


package br.com.caelum.goodbuy.infra;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;

import br.com.caelum.vraptor.ioc.Component;
import br.com.caelum.vraptor.ioc.ComponentFactory;

@Component
public class CriadorDeSession implements ComponentFactory {

private SessionFactory factory;


public void CriadordeSession(SessionFactory factory){
	this.factory = factory;
	
}


public Session getInstance(){
	
	Session session= factory.openSession();
	return session;
}

}


package br.com.caelum.goodbuy.testes;

import org.hibernate.Session;
import br.com.caelum.goodbuy.dao.ProdutoDao;
import br.com.caelum.goodbuy.modelo.Produto;
import br.com.caelum.vraptor.ioc.Component;

@Component
public class AdicaoDeProduto {

private static Session session;

public static void main(String[] args) {
	
	Produto produto = criaProduto();
	
	new ProdutoDao(session).salva(produto);
	
}	
private static Produto criaProduto() {
	Produto produto = new Produto();
	produto.setNome("Office 2007");
	produto.setDescricao("Teste do dia 29/08");
	produto.setPreco(2.90);
	return produto;
}

}


Grato desde já,

tá dando nullpointer em uma das suas classes… verifica qual é a linha, e qual dos objetos pode estar nulo

Valeu Lucas,

Vou tentar achar qual a classe ou objeto.Tenho um pouco de dificuldade para utilizar o modo Debug,
vc conhece algum link com tutorial para o Eclipse?

Abraço,

a linha que deu o nullpointer é só olhar na stacktrace…

Lucas,

Voltei um backup anterior do projeto e comecei novamente, cara não consigo entender o exec 8.2 no item 9 conforme abaixo,

As classes de teste que tínhamos criado não estão compilando mais, pois mudamos o construtor do
ProdutoDao. Mude as chamadas, usando as ComponentFactories para criar as dependências. Note que na
aplicação web, o VRaptor que vai se encarregar executar esse código.

Como faço esta alteração?

Minha classe AdicaoDeProduto:

import br.com.caelum.goodbuy.infra.CriadorDeSession;
import br.com.caelum.goodbuy.modelo.Produto;

public class AdicaoDeProduto {
public static void main(String[] args) {

	//Aquisicao da sessao
	@SuppressWarnings("unused")
	

	Session session = CriadorDeSession.getSession();   ***********erro! quando mudo para getInstance 
	
	
	//Criacao do produto
	Produto produto = criaProduto();
	
	//Adicao do produto no banco de dados
	new ProdutoDao(session).salva(produto);
}

private static Produto criaProduto() {
	Produto produto = new Produto();
	produto.setNome("Prateleira");
	produto.setDescricao("Uma prateleira para colocar livros");
	produto.setPreco(35.90);
	return produto;
}

}

o método não é estático, então vc precisa de uma instância da classe pra chamá-lo

PS: coloque os códigos entre e

Olá Lucas,

Realizei a alteração conforme abaixo, mas continua com o mesmo erro.

public class AdicaoDeProduto {
	private static SessionFactory factory;

	public static void main(String[] args) {
		
		
		//Aquisicao da sessao
		//@SuppressWarnings("unused")
		
		CriadorDeSession criadorDeSession = new CriadorDeSession(factory);
		Session session = criadorDeSession.getInstance();
		
		
		//Criacao do produto
		Produto produto = criaProduto();
		
		//Adicao do produto no banco de dados
		new ProdutoDao(session).salva(produto);
	}

	private static Produto criaProduto() {
		Produto produto = new Produto();
		produto.setNome("Prateleira");
		produto.setDescricao("Uma prateleira para colocar livros");
		produto.setPreco(35.90);
		return produto;
	}
}
@Component
public class ProdutoDao {
	
	//classe responsavel por encapsular as 
	//chamadas do Hibernate
	
	private Session session;
	
	public ProdutoDao(Session session){
		this.session = session;
	}

	public void salva(Produto produto) {
		
		Transaction tx = session.beginTransaction();
		session.save(produto);
		tx.commit();
	}
	@SuppressWarnings("unchecked")
	public List<Produto>listaTudo(){
		return this.session.createCriteria(Produto.class).list();
	}
	
	//carrega do banco o id de entrada do parametro
	public Produto carrega(Long id){
		return (Produto)this.session.load(Produto.class, id);
	}
	
	public void atualiza(Produto produto){
		Transaction tx=session.beginTransaction();
		this.session.update(produto);
		tx.commit();
	}
	
	public void remove(Produto produto){
		Transaction tx = session.beginTransaction();
		this.session.delete(produto);
		tx.commit();
	}
	
}

Console:

,234  INFO [DefaultRouteBuilder ] /produtos/lista                                   [ALL] -> ProdutosController.lista()
16:35:47,265 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for ProdutosController.adiciona(Produto) as [produto]
16:35:47,265 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for ProdutosController.adiciona(Produto) as [produto]
16:35:47,265 DEBUG [DefaultParametersControl] For /produtos/adiciona retrieved /produtos/adiciona with {}
16:35:47,265  INFO [DefaultRouteBuilder ] /produtos/adiciona                                [ALL] -> ProdutosController.adiciona(Produto)
16:35:47,265 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for ProdutosController.edita(Long) as [id]
16:35:47,265 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for ProdutosController.edita(Long) as [id]
16:35:47,265 DEBUG [DefaultParametersControl] For /produtos/edita retrieved /produtos/edita with {}
16:35:47,265  INFO [DefaultRouteBuilder ] /produtos/edita                                   [ALL] -> ProdutosController.edita(Long)
16:35:47,265 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for ProdutosController.altera(Produto) as [produto]
16:35:47,265 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for ProdutosController.altera(Produto) as [produto]
16:35:47,265 DEBUG [DefaultParametersControl] For /produtos/altera retrieved /produtos/altera with {}
16:35:47,265  INFO [DefaultRouteBuilder ] /produtos/altera                                  [ALL] -> ProdutosController.altera(Produto)
16:35:47,265 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for ProdutosController.formulario() as []
16:35:47,265 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for ProdutosController.formulario() as []
16:35:47,265 DEBUG [DefaultParametersControl] For /produtos/formulario retrieved /produtos/formulario with {}
16:35:47,265  INFO [DefaultRouteBuilder ] /produtos/formulario                              [ALL] -> ProdutosController.formulario()
16:35:47,265 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for ProdutosController.remove(Long) as [id]
16:35:47,265 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for ProdutosController.remove(Long) as [id]
16:35:47,265 DEBUG [DefaultParametersControl] For /produtos/remove retrieved /produtos/remove with {}
16:35:47,265  INFO [DefaultRouteBuilder ] /produtos/remove                                  [ALL] -> ProdutosController.remove(Long)
16:35:47,265 DEBUG [StereotypedBeansRegistrar] scanning class br.com.caelum.goodbuy.modelo.Mundo
16:35:47,265 DEBUG [ResourceHandler     ] Found resource: class br.com.caelum.goodbuy.modelo.Mundo
16:35:47,265 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for Mundo.boasVindas() as []
16:35:47,265 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for Mundo.boasVindas() as []
16:35:47,281 DEBUG [DefaultParametersControl] For /mundo/boasVindas retrieved /mundo/boasVindas with {}
16:35:47,281  INFO [DefaultRouteBuilder ] /mundo/boasVindas                                 [ALL] -> Mundo.boasVindas()
16:35:47,281 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for Mundo.paises() as []
16:35:47,281 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for Mundo.paises() as []
16:35:47,281 DEBUG [DefaultParametersControl] For /mundo/paises retrieved /mundo/paises with {}
16:35:47,281  INFO [DefaultRouteBuilder ] /mundo/paises                                     [ALL] -> Mundo.paises()
16:35:47,281  INFO [VRaptor             ] VRaptor 3.3.1 successfuly initialized
16:35:58,046 DEBUG [VRaptor             ] VRaptor received a new request
16:35:58,468 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ResourceLookupInterceptor
16:35:58,468 DEBUG [DefaultResourceTranslator] trying to access /produtos/formulario
16:35:58,484 DEBUG [DefaultResourceTranslator] found resource [DefaultResourceMethod: ProdutosController.formularioProdutosController.formulario()]
16:35:58,656 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ExceptionHandlerInterceptor
16:35:58,671 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor InstantiateInterceptor
31/08/2011 16:36:03 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet default threw exception
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'produtosController': Unsatisfied dependency expressed through constructor argument with index 0 of type [br.com.caelum.goodbuy.dao.ProdutoDao]: : Error creating bean with name 'produtoDao': Unsatisfied dependency expressed through constructor argument with index 0 of type [org.hibernate.Session]: : Error creating bean with name 'br.com.caelum.goodbuy.infra.CriadorDeSession': FactoryBean threw exception on object creation; nested exception is java.lang.NullPointerException; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'br.com.caelum.goodbuy.infra.CriadorDeSession': FactoryBean threw exception on object creation; nested exception is java.lang.NullPointerException; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'produtoDao': Unsatisfied dependency expressed through constructor argument with index 0 of type [org.hibernate.Session]: : Error creating bean with name 'br.com.caelum.goodbuy.infra.CriadorDeSession': FactoryBean threw exception on object creation; nested exception is java.lang.NullPointerException; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'br.com.caelum.goodbuy.infra.CriadorDeSession': FactoryBean threw exception on object creation; nested exception is java.lang.NullPointerException
	at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:730)
	at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:196)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1003)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:907)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:485)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
	at org.springframework.beans.factory.support.AbstractBeanFactory$2.getObject(AbstractBeanFactory.java:329)
	at org.springframework.web.context.request.AbstractRequestAttributesScope.get(AbstractRequestAttributesScope.java:43)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:325)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:263)
	at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1083)
	at br.com.caelum.vraptor.ioc.spring.SpringBasedContainer.instanceFor(SpringBasedContainer.java:86)
	at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:46)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:71)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:69)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:23)
	at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:58)
	at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Unknown Source)
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'produtoDao': Unsatisfied dependency expressed through constructor argument with index 0 of type [org.hibernate.Session]: : Error creating bean with name 'br.com.caelum.goodbuy.infra.CriadorDeSession': FactoryBean threw exception on object creation; nested exception is java.lang.NullPointerException; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'br.com.caelum.goodbuy.infra.CriadorDeSession': FactoryBean threw exception on object creation; nested exception is java.lang.NullPointerException
	at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:730)
	at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:196)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1003)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:907)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:485)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
	at org.springframework.beans.factory.support.AbstractBeanFactory$2.getObject(AbstractBeanFactory.java:329)
	at org.springframework.web.context.request.AbstractRequestAttributesScope.get(AbstractRequestAttributesScope.java:43)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:325)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:844)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:786)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:703)
	at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:795)
	at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:723)
	... 39 more
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'br.com.caelum.goodbuy.infra.CriadorDeSession': FactoryBean threw exception on object creation; nested exception is java.lang.NullPointerException
	at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:149)
	at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:109)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getObjectForBeanInstance(AbstractBeanFactory.java:1429)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:245)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:844)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:786)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:703)
	at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:795)
	at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:723)
	... 53 more
Caused by: java.lang.NullPointerException
	at br.com.caelum.goodbuy.infra.CriadorDeSession.getInstance(CriadorDeSession.java:27)
	at br.com.caelum.goodbuy.infra.CriadorDeSession.getInstance(CriadorDeSession.java:1)
	at br.com.caelum.vraptor.ioc.spring.ComponentFactoryBean.getObject(ComponentFactoryBean.java:43)
	at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:142)
	... 62 more
Caused by: java.lang.NullPointerException  
    at br.com.caelum.goodbuy.infra.CriadorDeSession.getInstance(CriadorDeSession.java:27)

o que tem nessa linha? o que pode ser null nessa linha?

Lucas,

Segue abaixo:

@Component
public class CriadorDeSession implements ComponentFactory<Session>{

	
	

	private final SessionFactory factory;

	public CriadorDeSession(SessionFactory factory){
		this.factory = factory;
		
		
	}
	
	public Session getInstance() {
		
		Session session = factory.openSession();//esta é a 27
		return session;
	}

}

então a factory está nula… como vc está retornando a factory no outro componentFactory?

não precisa me enviar, vc precisa entender o que está acontecendo.

Olá Lucas,

Obrigado pela força, consegui achar oque estava com o retorno NULL. Estudei novamente a parte
do hibernate ai consegui entender melhor o processo.Segue a classe que estava errada:

Abraço,

package br.com.caelum.goodbuy.infra;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;

import br.com.caelum.vraptor.ioc.Component;
import br.com.caelum.vraptor.ioc.ComponentFactory;

@Component
public class CriadorDeSessionFactory implements ComponentFactory<SessionFactory>{

	
	public SessionFactory getInstance() {
		AnnotationConfiguration configuration = new AnnotationConfiguration();
		configuration.configure();
		
		
		
		SessionFactory factory = configuration.buildSessionFactory();
		
		//*******Estava com retorno "null" ********
		return factory;
	}

}