2013-04-27 5 views
0

У меня проблема с моей пружиной, спящим приложением. Я пытаюсь сделать логин с весной безопасности, и у меня возникли проблемы с получением запроса учетной записи пользователя к БД для работы.весна, спящий режим, запрос базы данных postgres

Проблема в том, что мой код достигнет «test1», но он не достигнет «test2», и поскольку я не получаю никаких ошибок для консоли, а также приложение продолжит работу, я не знаю, что может быть проблемой.

Когда я нажимаю кнопку «Войти», я направлю на страницу с ошибкой входа в систему. Также я укажу, что я новичок с весной и спящим.

У кого-нибудь есть идеи, что я делаю неправильно?

UserAccountService.java

package main.java.services; 

import javax.persistence.EntityManager; 
import javax.persistence.PersistenceContext; 
import javax.persistence.Query; 

import main.java.model.UserAccount; 

import org.springframework.stereotype.Service; 
import org.springframework.transaction.annotation.Transactional; 

@Service("userAccountService") 
@Transactional 
public class UserAccountService { 

    private EntityManager entityManager; 

    @PersistenceContext 
    public void setEntityManager(EntityManager entityManager){ 
      this. entityManager = entityManager; 
     } 
    public UserAccount get(Integer id) 
    { 
     Query query = entityManager.createQuery("FROM user_account as ua WHERE ua.id="+id); 
     return (UserAccount) query.getSingleResult(); 
    } 

    public UserAccount get(String username) 
    { 
     System.out.println("test1"); 
     Query query = entityManager.createQuery("FROM user_account as ua WHERE ua.username='"+username+"'"); 
     System.out.println("test2"); 
     return (UserAccount) query.getSingleResult(); 
    } 

    public void add(UserAccount userAccount) 
    { 
     entityManager.persist(userAccount); 
    } 
} 

LoginService.java

package main.java.services; 

import javax.annotation.Resource; 

import main.java.model.UserAccount; 
import main.java.security.CustomUserDetails; 
import main.java.security.UserGrantedAuthority; 

import org.springframework.security.core.GrantedAuthority; 
import org.springframework.security.core.userdetails.UserDetails; 
import org.springframework.security.core.userdetails.UserDetailsService; 

public class LoginService implements UserDetailsService{ 

    @Resource(name="userAccountService") 
    private UserAccountService userAccountService; 

    public LoginService(){ } 

    public UserDetails loadUserByUsername(String username){ 
    if (username != null && !username.equals("")){ 
     UserAccount userAccount = userAccountService.get(username); 
     System.out.println(userAccount); 
     if (userAccount == null) { 
      return null; 
     } 
     GrantedAuthority grantedAuth = new UserGrantedAuthority(userAccount.getAuthority()); 
     System.out.println(userAccount.getId() + userAccount.getAuthority()+userAccount.getPassword()); 
     return new CustomUserDetails(userAccount.getId(), userAccount.getUsername(), userAccount.getPassword(), new GrantedAuthority[]{ grantedAuth }); 
    } else { 
     return null; 
    } 
} 
} 

hibernateContext.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: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-3.1.xsd 
     http://www.springframework.org/schema/tx 
     http://www.springframework.org/schema/tx/spring-tx-3.1.xsd"> 

    <context:property-placeholder location="/WEB-INF/jdbc.properties" /> 

    <tx:annotation-driven transaction-manager="transactionManager" /> 

    <!-- Declare a datasource that has pooling capabilities--> 
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" 
      destroy-method="close" 
      p:driverClass="${jdbc.driverClassName}" 
      p:jdbcUrl="${jdbc.url}" 
      p:user="${jdbc.username}" 
      p:password="${jdbc.password}" 
      p:acquireIncrement="5" 
      p:idleConnectionTestPeriod="60" 
      p:maxPoolSize="100" 
      p:maxStatements="50" 
      p:minPoolSize="10" /> 

    <!-- Declare a JPA entityManagerFactory--> 
    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" > 
     <property name="persistenceXmlLocation" value="classpath*:META-INF/persistence.xml"></property> 
     <property name="persistenceUnitName" value="hibernatePersistenceUnit" /> 
     <property name="dataSource" ref="dataSource"/> 
     <property name="jpaVendorAdapter"> 
      <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" > 
       <property name="databasePlatform"> 
        <value>${jdbc.dialect}</value> 
       </property> 
       <property name="showSql" value="true"/> 
      </bean> 
     </property> 
    </bean> 

    <!-- Declare a transaction manager--> 
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
     <property name="entityManagerFactory" ref="entityManagerFactory" /> 
    </bean> 

</beans> 

ответ

2

Впервые чтения вашего поста я могу обнаружить, что ваш запрос неправильно ... Ваш запрос представляет собой SQL-запрос. В этом случае вместо createQuery() следует использовать createNativeQuery() . Правильный запрос (при условии, что я не знаю вам классов):

Query query = entityManager.createQuery("SELECT us FROM UserAccount as ua WHERE ua.username='"+username+"'"); 

где учетная_запись_пользователь этого имя класса, а не имя таблицы. Более того, лучше использовать подготовленный оператор (google it) для передачи аргументов в запрос.

+0

Когда я использовал этот запрос «FROM UserAccount как ua WHERE ua.username = '» + имя пользователя + «», результат waqs тот же, он не прошел «test2». Когда я попробовал nativeQuery, я получил результат из спящего режима, но он не получил никаких результатов из БД (так что у меня может быть ошибка conf conf?). Даже если я получаю исходный запрос для работы, я бы не захотел придерживаться этих. Не уверен, как правильно использовать prepareStatemtn с EntityManager, но я буду продолжать работать с этим. – Kapaacius