【问题标题】:Spring injecting an interface implementation gives NullpointerSpring注入接口实现给了Nullpointer
【发布时间】:2013-07-26 08:15:03
【问题描述】:

我对 Spring 和 Spring 安全性非常陌生!

在学习了一些教程之后,我现在尝试在我们的应用程序中实现 Spring Security。我遇到的问题是我想用存根测试我的班级UserDetailsImpl。因此,我希望 Spring 将 2 个对象作为我创建的存根注入(它们从接口实现)。这样,当我运行测试时,存根将被实现,但在生产代码期间,将注入正常的实际实现。不幸的是,我得到了NullPointerException。这是我的代码:

需要注入的类:

package com.somePackageName.security;

imports...

@Component
public class UserDetailsImpl implements UserDetails {

@Autowired
IUserFactory userFactory;

public void setUserFactory(IUserFactory userFactory){
    this.userFactory = userFactory;
}

@Autowired
IUser user;

public void setUser(IUser user){
    this.user = user;
}

IUser 和 IUserFactory 是接口。

这是我要实现的 IUserFactory 存根:

package com.somePackageName;

import com.su.rbac.virtuoso.IUser;
import com.su.rbac.virtuoso.IUserFactory;

public class StubUserFactory implements IUserFactory {

public StubUserFactory(){}

@Override
public IUser findUserWithUsername(String username) {
    return new StubUser();
}

@Override
public IUser createUser(String username, String password) {
    return new StubUser();
}
}

最后是我的application-context.xml 文件:

<global-method-security pre-post-annotations="enabled"/>
<context:annotation-config />
<context:component-scan base-package="com.somePackageName" />

<beans:bean id="userDetailsImpl" class="com.somePackageName.security.UserDetailsImpl">
    <!--
    <beans:property name="userFactory" value="com.somePackageName.StubUserFactory"/>
    <beans:property name="user" value="com.somePackageName.StubUser"/>
    -->

    <beans:property name="userFactory" ref="StubUserFactory"/>
    <beans:property name="user" ref="StubUser"/>
</beans:bean>

<beans:bean id="StubUser" class="com.somePackageName.StubUser"/>
<beans:bean id="StubUserFactory" class="com.somePackageName.StubUserFactory"/>

我得到的错误是:

java.lang.NullPointerException
at com.somePackageName.security.UserDetailsImpl.<init>(UserDetailsImpl.java:44)
at com.somePackageName.security.QuadstoreUserService.loadUserByUsername(QuadstoreUserService.java:23)
at com.somePackageName.SpringSecurityTest.firstTest(SpringSecurityTest.java:41)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74)
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83)
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:88)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174)
at org.junit.runner.JUnitCore.run(JUnitCore.java:157)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:77)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:195)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:63)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)

我真的坚持这个,因为我似乎无法在互联网上找到一个好的和清晰的例子。非常感谢您!

【问题讨论】:

  • 您在 bean id 中有一个错字:userDeatilsImpl (还不知道,如果这就是问题所在)。
  • Bean id 应该无关紧要,除非他在某处使用它。
  • 哈哈哇我觉得好傻!谢谢。虽然仍然是相同的消息错误
  • @Lenymm:是的。 Rens:你确定这个类被考虑自动装配(例如通过使用@Component)注解)?
  • 谢谢 Wolfram,我不知道这是必要的!我现在将它添加到 UserDetailsImpl。但什么都没有改变。

标签: java spring dependency-injection spring-security


【解决方案1】:

您好像没有启用注释,请尝试添加:

<context:annotation-config />
<context:component-scan base-package="<your_package_name>,<your_another_package_name>" />

xmlns:

xmlns:context="http://www.springframework.org/schema/context"

xsi 架构位置:

http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd

【讨论】:

  • 我已经为你添加了 xmlns 和 xsi。
  • 非常感谢!我已经阅读了一些关于它的文档。我可以看到我需要它,但即使我添加了它,也没有任何改变......嗯
  • 尝试将@Component 注解添加到您的 UserDetailsImpl。
  • 也这样做了,我已经编辑了我的问题,所以我的代码按照我现在的样子应用
  • 还是不行?如果是这样,请检查您的 conf 文件...您可能有更多文件,您需要弄清楚将组件扫描标签放在哪里。
猜你喜欢
  • 2019-04-09
  • 1970-01-01
  • 1970-01-01
  • 2022-01-05
  • 1970-01-01
  • 2020-12-26
  • 2011-12-05
  • 2016-07-25
相关资源
最近更新 更多