2010-09-22 4 views
2

Eh bien, le code fonctionne sous l'environnement de test, mais pas sur le contexte avant de l'application. Cela me rend fou pour être honnête.La création de produit ne fonctionne pas (sous Spring MVC avec JPA)

Voici le contrôleur :

package org.admios.nuevoproyecto.controller; 

import java.util.List; 
import org.springframework.web.bind.WebDataBinder; 
import org.springframework.web.bind.annotation.InitBinder; 
import org.springframework.web.bind.annotation.RequestMethod; 
import org.springframework.validation.BindingResult; 
import org.admios.nuevoproyecto.dao.ProductDAO; 
import org.admios.nuevoproyecto.model.Product; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.ModelAttribute; 
import org.springframework.web.bind.annotation.RequestMapping; 

import org.apache.log4j.Logger; 
import org.springframework.web.bind.annotation.PathVariable; 

import static java.lang.System.out; 

@Controller 
@RequestMapping("/product") 
public class ProductController { 

    private static Logger logger = Logger.getLogger(ProductController.class); 

    @Autowired 
    ProductDAO pdi; 

    @InitBinder 
    public void setAllowedFields(WebDataBinder dataBinder) { 
     dataBinder.setDisallowedFields("id"); 
    } 

    @RequestMapping(value="/list") 
    public void listAllProducts() { 
     List<Product> products = pdi.getProducts(); 

     for (Product product : products) { 
      System.out.println("Title: " + product.getTitle()); 
      System.out.println("Description: " + product.getDescription()); 
      System.out.println("Price: " + product.getPrice()); 
      System.out.println("--------"); 
     } 
    } 

    @RequestMapping(value="/add", method=RequestMethod.POST) 
    public String addProduct(@ModelAttribute Product product, BindingResult result) { 
     logger.info("Entrando en el metodo para agregar nuevo producto"); 

//  Product newProduct = new Product(); 
//  newProduct.setTitle("Titulo del producto2s"); 
//  newProduct.setDescription("Descripcion del producto"); 
//  newProduct.setPrice(220f); 

     System.out.println(product.getPrice()); 

     Product savedProduct = pdi.saveProduct(product); 

     System.out.println(savedProduct.getId()); 

     return "hello"; 
    } 

    @RequestMapping(value="/form") 
    public String viewForm() { 
     out.println("entering viewForm()"); 
     return "addproduct"; 
    } 

    @RequestMapping(value="/view/{id}", method=RequestMethod.GET) 
    public void viewProduct(@PathVariable("id") Long id) { 
     System.out.println(id); 
    } 

    @ModelAttribute("product") 
    public Product getProductObject() { 
     out.println("entering getProductObject()"); 
     return new Product(); 
    } 
} 

L'implémentation DAO:

package org.admios.nuevoproyecto.dao; 

import java.util.List; 
import javax.persistence.EntityManagerFactory; 
import org.admios.nuevoproyecto.model.Product; 
import org.apache.log4j.Logger; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.orm.jpa.support.JpaDaoSupport; 
import org.springframework.stereotype.Repository; 
import org.springframework.transaction.annotation.Propagation; 
import org.springframework.transaction.annotation.Transactional; 

@Repository 
public class ProductDaoImp extends JpaDaoSupport implements ProductDAO { 

    private static Logger log = Logger.getLogger(ProductDaoImp.class); 

    @Autowired 
    public ProductDaoImp(EntityManagerFactory entityManagerFactory) { 
     super.setEntityManagerFactory(entityManagerFactory); 
    } 

    @Override 
    public List<Product> getProducts() { 
     return getJpaTemplate().find("select p from Product p"); 
    } 

    @Override 
    @Transactional(propagation = Propagation.REQUIRED, readOnly = false) 
    public Product saveProduct(Product product) { 
     log.info("Trying to create a new product"); 

     Product newProduct = getJpaTemplate().merge(product); 
     log.info(newProduct.getDescription()); 
     log.info(newProduct.getTitle()); 
     log.info(newProduct.getId()); 
     log.info(newProduct.getPrice()); 

     return newProduct; 
    } 

    @Override 
    public void removeProduct(Product product) { 
     getJpaTemplate().remove(product); 
    } 

    @Override 
    public Product getProductById(Integer id) { 
     return getJpaTemplate().find(Product.class, id); 
    } 

} 

Le applicationContext ressemble à ceci: http://pastie.org/1175350

+1

Que signifie "ne fonctionne pas" signifie? Avez-vous des erreurs, que montrent les journaux, etc.? –

+0

Une question rapide. Vous avez une variable Logger dans ProductController mais vous utilisez System.out.prinlln() pour obtenir des informations. N'est-ce pas un peu gênant? – dira

+0

éviter de rendre les méthodes DAO transactionnelles - les méthodes de service devraient plutôt être transactionnelles – Bozho

Répondre

0

Avez-vous essayé avec getJpaTemplate().persist(Object)?

1

gestionnaire de transactions 1.Créez comme suit:

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" > 
    <property name="persistenceUnitName" value="persistanceUnit"/> 
    <property name="dataSource" ref="dataSource"/> 
    <property name="persistenceXmlLocation" value="classpath:persistence.xml"/> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
      <property name="showSql" value="${db.orm.showsql}" />    
      <property name="generateDdl" value="${db.orm.generateDdl}" />    
      <property name="database" value="${db.type}"/> 
      <property name="databasePlatform" value="${db.orm.dialect}" /> 
     </bean> 
    </property> 
    <property name="jpaProperties"> 
     <props> 
      <prop key="hibernate.hbm2ddl.auto">create</prop> 
     </props> 
    </property> 
</bean> 

2.Utiliser persistance.xml

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"> 
    <persistence-unit name="persistanceUnit" transaction-type="RESOURCE_LOCAL"> 
    <description>Oracle db Persistence Unit</description> 
    <class>com.company.YourModelClass</class> 
    <properties/> 
    </persistence-unit> 
</persistence> 

3.Ajouter annotation suivante dans applicationContext.xml

<context:component-scan base-package="com.yourcompany.basepackage" /> 

4 .annulez votre Entitymanager dans la classe de service comme:

@PersistenceContext 
private EntityManager em = null; 

5.Inject TrasnsactionManager à:

private PlatformTransactionManager platformTransactionManager = null; 

objet 6.persist comme:

platformTransactionManager .persist(obj); 
+0

Le lien de votre blog n'était * pas * lié au sujet de cette question. Ne refais pas ça. J'ai modifié le lien. –

Questions connexes