[Resolvido] Integrar VRaptor e Spring

Olá pessoal, estou tentando integrar o VRaptor com o Spring sendo que não estou conseguindo, eu estou achando que deve ser algum jar que está faltando ou estou importando errado.
Bem estou tentando fazer o Exercicio 16.3 da Apostila fj28 VRaptor. VOu colocar as classes e modificações que criei e explicar os erros que esta ocorrendo:

Classe applicationContext.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:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="
              http://www.springframework.org/schema/beans
              http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
              http://www.springframework.org/schema/tx
              http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
       <tx:annotation-driven />
       
       <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
           <property name="sessionFactory" ref="sessionFactory" />
       </bean>
       
       <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
           <property name="configLocation">
               <value>classpath:/hibernate.cfg.xml</value>
           </property>
       </bean>
       
   </beans>

CriadorDeSessionFactory aonde só pede para retirar a anotação @Component:

package br.com.caelum.goodbuy.infra;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

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

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


@ApplicationScoped
public class CriadorDeSessionFactory implements
		ComponentFactory<SessionFactory> {

	private SessionFactory factory;
	private Session session;

	// @PostConstruction serão executados assim que o escopo for iniciado,
	// ouseja, no começo da
	// requisição, sessão de usuário ou da aplicação.

	@PostConstruct
	public void abre() {
		AnnotationConfiguration configuration = new AnnotationConfiguration();
		configuration.configure();
		this.factory = configuration.buildSessionFactory();
		System.out
				.println("criado PostConstruction do metodo abre da classe CriadorDeSessionFactory");
	}

	public SessionFactory getInstance() {
		System.out.println("criado o getInstance da classe CriadorDeSessionFactory");
		return this.factory;

	}

	// @PreDestroy serão executados assim que o escopo for finalizado, ou seja,
	// no final da requisição, sessão de usuário ou da aplicação.
	@PreDestroy
	public void fecha() {
		this.factory.close();
		System.out
				.println("criado o @Predestroy do metodo fecha da clase CriadorDeSessionFactory");
	}

}

Classe CriadorDeSession:

package br.com.caelum.goodbuy.infra;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

import net.vidageek.mirror.dsl.Mirror;

import org.springframework.orm.hibernate3.SessionFactoryUtils;

import br.com.caelum.vraptor.proxy.MethodInvocation;
import br.com.caelum.vraptor.proxy.Proxifier;
import br.com.caelum.vraptor.proxy.SuperMethod;

import org.hibernate.Session;
import org.hibernate.SessionFactory;

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


@Component
public class CriadorDeSession implements ComponentFactory<Session> {

	private SessionFactory factory;
	private final Proxifier proxifier;
	private Session session;
	

	public CriadorDeSession(SessionFactory factory, Proxifier proxifier) {
		this.factory = factory;
		this.proxifier = proxifier;
		System.out
				.println("criado Factory e Proxifier - construtor da classe CriadorDeSession");
	}

	@PostConstruct
	public void abre() {
		this.session = proxifier.proxify(Session.class,
				new MethodInvocation<Session>() {
					public Object intercept(Session proxy, Method method,
							Object[] args, SuperMethod superMethod) {
						Session sessionDoSpring = SessionFactoryUtils
								.doGetSession(factory, true);
						return new Mirror().on(sessionDoSpring).invoke()
								.method(method).withArgs(args);
					}
				});
	}

	public Session getInstance() {
		return this.session;
	}

	@PreDestroy
	public void fecha() {
		this.session.close();
	}
}

[color=red]Erros que apresentam a classe CriadorDeSession:
[/color]
1º neste import:

import org.springframework.orm.hibernate3.SessionFactoryUtils;

e no método abre:

@PostConstruct
	public void abre() {
		this.session = proxifier.proxify(Session.class,
				new MethodInvocation<Session>() {
					public Object intercept(Session proxy, Method method,
							Object[] args, SuperMethod superMethod) {
						Session sessionDoSpring = SessionFactoryUtils
								.doGetSession(factory, true);
						return new Mirror().on(sessionDoSpring).invoke()
								.method(method).withArgs(args);
					}
				});
	}

[color=red]Erros:[/color]

Classe ProdutoDAO:

package br.com.caelum.goodbuy.dao;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Restrictions;

import br.com.caelum.goodbuy.modelo.Produto;
import br.com.caelum.vraptor.ioc.Component;
import org.springframework.transaction.annotation.Transactional;


@Component
public class ProdutoDAO {
	private final Session session;

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

	@Transactional
	public void salva(Produto produto) {

		Transaction tx = session.beginTransaction();
		session.save(produto);
		tx.commit();
	}

	public Produto carrega(Long id) {
		return (Produto) session.load(Produto.class, id);
	}

	 @Transactional
	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();
	}

	public List<Produto> listaTudo() {
		return this.session.createCriteria(Produto.class).list();
	}

	public List<Produto> busca(String nome) {
		return session.createCriteria(Produto.class)
				.add(Restrictions.ilike("nome", nome, MatchMode.ANYWHERE))
				.list();
	}

	public void recarrega(Produto produto) {
		session.refresh(produto);
	}

}

Me apresenta um erro neste import:

import org.springframework.transaction.annotation.Transactional;

E daí quando vou usar a anotação @ransactional me aparece um erro, por exemplo:

[code]
@Transactional
public void salva(Produto produto) {

	Transaction tx = session.beginTransaction();
	session.save(produto);
	tx.commit();
}[/code]

[color=red]O erro me apresenta que:[/color]

Não tenho idéia do que devo fazer alguém pode me ajudar?? Um Saludo e obrigado desde já!

vc está com os jars do spring orm?

tenho estes!


então coloque o jar do spring orm

Esse Spring ORM não tem no pacote do VRaptor! Eu baixei outras versoes do Spring e tenho aqui, posso colocar outra versao por exemplo a 3.2? porque a versao que estou utilizando do Spring é a que vem com o VRaptor a 3.0.5 Release.

sim, pq o spring orm não é dependência do VRaptor… vc só precisa dele se usar o módulo ORM do spring.

procure os jars do spring 3.0.5… baixe por aqui:

http://mvnrepository.com/artifact/org.springframework/spring-orm

talvez ele vá pedir pra baixar mais coisas… o ideal é usar algo como o maven pra ele baixar todas as dependências…

bem o 1º erro do import org.springframework.orm.hibernate3.SessionFactoryUtils;
já nao existe mais, mas o resto dos erros continua, então percebi que era o jar, entao por exemplo o proximo jar deve ser o spring transaction?
por causa do erro no import org.springframework.transaction.annotation.Transactional;??
e sobre o resto dos erros tem ideia do que é Lucas? muito obrigado por se imporar!

quais são os erros que estão acontecendo agora?

ñ sei se vc viu mas tem mostrando no 1º post tem mostrando as classes que estou utilizando e os respectivos [color=red]erros em vermelho[/color].
como os Erros na classe CriadorDeSession no método abre():

[list]The type new MethodInvocation(){} must implement the inherited abstract method MethodInvocation.intercept(Session, Method, Object[], SuperMethod)[/list]

[list]Method cannot be resolved to a type [/list]
[list]SessionFactoryUtils cannot be resolved[/list]

Eu fiz o print de 3 erros e anexei, abaixo vc pode ver.

método abre:

@PostConstruct public void abre() { this.session = proxifier.proxify(Session.class, new MethodInvocation<Session>() { public Object intercept(Session proxy, Method method, Object[] args, SuperMethod superMethod) { Session sessionDoSpring = SessionFactoryUtils .doGetSession(factory, true); return new Mirror().on(sessionDoSpring).invoke() .method(method).withArgs(args); } }); }






Outros erros:
erro em pastaImagens no metodo mostra() da classe ImagensController:

 public File mostra(Produto produto) {
	        return new File(pastaImagens, produto.getId() + ".imagem");
	}[/code]

depois no metodo upload, apresenta um erro em notNullValue():

[code]@Post("/produtos/{produto.id}/imagem")
    public void upload(Produto produto,
            final UploadedFile imagem) {
        validator.checking(new Validations() {{
				if (that(imagem, is(notNullValue()), "imagem",
                    "imagem.nula")) {
                that(imagem.getContentType(),
                        startsWith("image"), "imagem", "nao.eh.imagem");
} }});
        validator
                .onErrorRedirectTo(ProdutosController.class)
                .edita(produto.getId());
        imagens.salva(imagem, produto);
        result.redirectTo(ProdutosController.class)
                .edita(produto.getId());
}




erros em ProtudoDAO para fazer o Transactional.



Esse erro do Spring Transaction eu já saquei o erro, faltava o org.springframework.transaction-3.0.5.RELEASE.jar, link: http://www.java2s.com/Code/Jar/o/Downloadorgspringframeworktransaction305RELEASEjar.htm
Agora os outros erros eu desconheço devo ter importado mal, mas esse 1º erro do pacote na classe ImagensController não sei o que fazer, ele diz para configurar build path.

apaga o import e gera de novo…

dica pra vida: Ctrl+Shift+O no eclipse te ajuda a organizar os imports e importar as classes certas…

no caso do Method é a java.lang.reflect.Method…

qto a pastaImagens é um atributo que deveria estar no controller, e é um File apontando pra onde as imagens vao ser salvas e a do notNullValue vem de um import static em org.hamcrest.Matchers.*

Acabo de resolver outro problema esse do build Path. Eu vi aqui no guj que uma pessoa passou por isso e você lucas o ajudou.
Para resolver a solução é adicionar o jar hamcrest-all.jar que está no zip do vraptor na pasta lib/optional, no seu classpath
Link aonde eu vi a resolução do problema: http://www.guj.com.br/java/197418-resolvido-problema-ao-configurar-vraptor—projeto-em-andamento

E sobre isso do import java.lang.reflect.Method; no CriadorDeSession e realmente era o problema, eu geralmente utilizo o ctrl+shift+O e ele me adiciona os imports, sendo que tem vezes que você nao sabe o que escolher e passa por isso.

e daí sobre isso do Imagens controller eu fiz isso:

private final File pastaImagens;
	
	public ImagensController(Validator validator, Imagens imagens, Result result, File pastaImagens) {
		this.validator = validator;
		this.imagens = imagens;
		this.result = result;
		this.pastaImagens= pastaImagens;
	}

era pra fazer isso neh no construtor?

mas os erros do notNullValue() continua e me pareceu um outro neste mesmo metodo upload
com startsWith(“image”)

[color=red]Erro que apresenta:[/color]

[quote]The method startsWith(String) is undefined for the type new Validations()
{}[/quote]

e também coloquei o import: import org.hamcrest.Matcher; ou import org.hamcrest.Matchers.; ou import org.hamcrest.Matcher.; ou import org.hamcrest.Matchers;
e nada.

Eu tenho para mim que esta o erro em imoprtar o validator.

agora esta uitlizando esse import : import br.com.caelum.vraptor.Validator;
import br.com.caelum.vraptor.validator.Validations;

eu apaguei e importei o do spring: import org.springframework.validation.Validator;
e tampouco nada.

Qual deveria usar para este exemplo? Abaixo esta a imagem das opções que deveria importar


Olá Lucas eu reli o que você recomendou e agora me funcionou. Me desculpa!
Bem eu importe como voce disse: import static org.hamcrest.Matchers.*;
Eu nunca vi isso “import static”, porque fez isso? diferente esse import.

nao receba a pastaImagens no construtor, pq o Vraptor não saberá o que colocar aí… defina alguma pasta do seu sistema, dando new File no construtor mesmo.

olá Lucas, a pastaImagens esta declarado na classe Imagens.

[code]
public class Imagens {

private File pastaImagens;

public Imagens(ServletContext context) {
	String caminhoImagens = context.getRealPath("/WEB-INF/imagens");

	pastaImagens = new File(caminhoImagens);
	pastaImagens.mkdir();
}

 [/code]

deveria fazer um get e colocar imagens.getPastaimagens? estou confuso.