Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring数据JPA+;webapp中的OpenJPA@autowired存储库字段为空,但junit可以使用_Java_Spring_Jpa_Openjpa - Fatal编程技术网

Java Spring数据JPA+;webapp中的OpenJPA@autowired存储库字段为空,但junit可以使用

Java Spring数据JPA+;webapp中的OpenJPA@autowired存储库字段为空,但junit可以使用,java,spring,jpa,openjpa,Java,Spring,Jpa,Openjpa,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:context="http://www.springframework.org/schema/context" xmln

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:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:p="http://www.springframework.org/schema/p" xmlns:cache="http://www.springframework.org/schema/cache"
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
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.xsd   
http://www.springframework.org/schema/aop    
http://www.springframework.org/schema/aop/spring-aop.xsd   
http://www.springframework.org/schema/tx    
http://www.springframework.org/schema/tx/spring-tx.xsd    
http://www.springframework.org/schema/cache    
http://www.springframework.org/schema/cache/spring-cache.xsd    
http://www.springframework.org/schema/data/jpa    
http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">    

<context:annotation-config />

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

<!-- 定义实体管理器工厂 -->
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="eipjpa" />
</bean>

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>

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

<jpa:repositories base-package="com.company.repository" />
    <?xml version="1.0" encoding="UTF-8"?>
<persistence 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"
    version="1.0">
        <persistence-unit name="eipjpa" transaction-type="RESOURCE_LOCAL">
            <provider>  
                org.apache.openjpa.persistence.PersistenceProviderImpl  
            </provider>
            <class>com.company.domain.User</class>
            <properties>
                <property name="openjpa.ConnectionURL" value="jdbc:mysql://localhost:3306/eipdb?characterEncoding=utf-8" />
                <property name="openjpa.ConnectionUserName" value="root" />
                <property name="openjpa.ConnectionPassword" value="passw0rd" />
                <property name="openjpa.Log" value="DefaultLevel=WARN, Runtime=INFO, Tool=INFO, SQL=TRACE" />
                <property name="openjpa.DynamicEnhancementAgent" value="true"/>
            </properties>
        </persistence-unit>
    </persistence>  
存储库界面

@Repository
public interface UserRepository extends CrudRepository<User, Integer> {

    List<User> findUserByUsernameAndPassword(String username, String password);
}
public interface UserService {

    void saveUser(User user);

    User findUserById(Integer id);

    void updateUser(User user);

    void deleteUserById(Integer id);

    public boolean checkUserLogin(User user);
}
@Service("userService")
public class UserServiceImpl implements UserService {

    @Autowired
    private UserRepository userRepository;

    @Override
    @Transactional
    public void saveUser(User user) {
        userRepository.save(user);

    }

    @Override
    @Transactional(readOnly = true)
    public User findUserById(Integer id) {
        return userRepository.findOne(id);
    }

    @Override
    @Transactional
    public void updateUser(User user) {
        userRepository.save(user);
    }

    @Override
    @Transactional
    public void deleteUserById(Integer id) {
        userRepository.delete(id);
    }

    @Override
    @Transactional(readOnly = true)
    public boolean checkUserLogin(User user) {
        System.out.println(userRepository);
        return userRepository.findUserByUsernameAndPassword(user.getUsername(), user.getPassword()).size() == 0 ? false
                : true;
    }
用户服务的实施

@Repository
public interface UserRepository extends CrudRepository<User, Integer> {

    List<User> findUserByUsernameAndPassword(String username, String password);
}
public interface UserService {

    void saveUser(User user);

    User findUserById(Integer id);

    void updateUser(User user);

    void deleteUserById(Integer id);

    public boolean checkUserLogin(User user);
}
@Service("userService")
public class UserServiceImpl implements UserService {

    @Autowired
    private UserRepository userRepository;

    @Override
    @Transactional
    public void saveUser(User user) {
        userRepository.save(user);

    }

    @Override
    @Transactional(readOnly = true)
    public User findUserById(Integer id) {
        return userRepository.findOne(id);
    }

    @Override
    @Transactional
    public void updateUser(User user) {
        userRepository.save(user);
    }

    @Override
    @Transactional
    public void deleteUserById(Integer id) {
        userRepository.delete(id);
    }

    @Override
    @Transactional(readOnly = true)
    public boolean checkUserLogin(User user) {
        System.out.println(userRepository);
        return userRepository.findUserByUsernameAndPassword(user.getUsername(), user.getPassword()).size() == 0 ? false
                : true;
    }
问题

当我用junit测试它时,它工作得很好

@Test
public void login() {
    User user = new User();
    user.setUsername("Annie");
    user.setPassword("passw0rd");
    UserService service = ctx.getBean(UserService.class);
    Assert.assertTrue(service.checkUserLogin(user));
    user.setPassword("password");
    Assert.assertFalse(service.checkUserLogin(user));
}
但当我在webapp中尝试时,出现了以下错误。。。我检查了UserServiceImpl类中的userRepository是否为null。。。我不知道如何修复它

Feb 19, 2014 12:25:53 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [dispatcher] in context with path [/EIP] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause
java.lang.NullPointerException
    at com.company.service.impl.UserServiceImpl.checkUserLogin(UserServiceImpl.java:53)
    at com.company.controller.UserController.login(UserController.java:30)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176)
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:436)
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:424)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:409)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1044)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:313)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
    at java.lang.Thread.run(Thread.java:695)

Spring将永远不会留下像这样的注射目标

@Autowired
private UserRepository userRepository;
null
。如果无法解决依赖关系,它将抛出各种异常

换句话说,在web应用程序中,Spring不能参与创建
UserServiceImpl
对象。我猜你是用
new
自己创建的。相反,您应该向它注入
@Autowired
,或者至少直接从
ApplicationContext
获取它(糟糕的做法)


然而,在您的测试用例中,您显然是从
ApplicationContext
获取实例,因此它是一个托管bean,并且它的依赖关系已经得到解决。

Spring将永远不会留下像这样的注入目标

@Autowired
private UserRepository userRepository;
null
。如果无法解决依赖关系,它将抛出各种异常

换句话说,在web应用程序中,Spring不能参与创建
UserServiceImpl
对象。我猜你是用
new
自己创建的。相反,您应该向它注入
@Autowired
,或者至少直接从
ApplicationContext
获取它(糟糕的做法)


然而,在您的测试用例中,您显然是从
ApplicationContext
获取实例,因此它是一个托管bean,其依赖关系已得到解决。

让我们看看您在web应用程序中使用
userserviceinpl
(或
UserService
)的位置。同时显示其声明。粘贴控制器的代码,它应该已自动连接服务。让我们看看您在web应用程序中使用
userserviceinpl
(或
UserService
)的位置。同时显示其声明。粘贴控制器的代码,它应该已自动连接服务。@9tailscat当我开始实现我的
@Controller
@service
等类时,我总是首先用
@autowired
(或
@Inject
)注释我的字段。像这样你别忘了。我确实在我的控制器中使用了
new
。。。刚刚将其更改为
@Autowired
。现在很好用。谢谢大家!@9tailscat不客气。我不明白,你是怎么解决的?@9tailscat当我开始实现我的
@Controller
@Service
等类时,我总是先用
@Autowired
(或
@Inject
)注释我的字段。像这样你别忘了。我确实在我的控制器中使用了
new
。。。刚刚将其更改为
@Autowired
。现在很好用。谢谢大家!@不客气。我不明白,你是怎么解决的?