1

我的实体类中有几个@Value 注释。我不知道为什么,但他们都返回 null。我还有“ShaPasswordEncoder”Autowired 对象,它也抛出了 NullPointer 异常。我不知道为什么。请指教。

@Repository

@Configurable
@Entity
@Table(name="user")
@NamedQueries({...})
public class User implements Serializable{

    @Transient private static final Logger logger = Logger.getLogger(User.class);
    @Transient private static final AppUtil appUtil = new AppUtil();
    @Transient @Value("some value") private String extDir;
    @Transient @Value("100x100") private String imageSize;
    @Transient private static byte[] salt = "FBar".getBytes();
    @Transient @Autowired private ShaPasswordEncoder passwordEncoder;

....
//Default Constructor
    public User(){
        logger.info("TEST IMAGE => "+imageSize);


    }

    public String passwordEncoder(String password) {
        return passwordEncoder.encodePassword(password,salt);
    }
4

4 回答 4

1

将 JPA 实体作为 Spring bean 是一个糟糕的设计。你应该保持你的实体简单:只有 getter 和 setter。

// Only JPA annotations
@Entity
@Table(name="user")
@NamedQueries({...})
public class User {
    // Getters & Setters
}

然后你应该将业务逻辑委托给服务类:

@Service
public class UserService {

    @Autowired
    private ShaPasswordEncoder passwordEncoder;

    @Value("${conf.extDir}")
    private String dir;

   // Some operations ...

   public void createUser(User user) {
       // ...
   }

   public void updateUser(User user) {
       // ...
   }
}
于 2013-07-29T14:44:47.113 回答
0

在 POJO 上使用 Spring 注释意味着您将此 bean 的创建和配置委托给 Spring IoC 容器!Spring 容器将提供所有必需的依赖项。

例如:

@Component
public class MyBean {
    @Value("${data}")
    private String data;

    @Autowired
    private MyService service;

    // ...

}
  • 当您尝试使用 new 运算符实例化 bean 时,您将获得空值。

MyBean bean = new MyBean();

  • 为了拥有一个完全配置的 bean,您必须从 applicationContext 中获取它。Spring 容器将提供所有请求的依赖项。

MyBean bean = (MyBean) applicationContext.getBean(MyBean.class);

或者

@Component
public class AnotherBean {

    // You are sure that Spring will create and inject the bean for you.
    @Autowired
    private MyBean bean;
}
于 2013-07-29T14:56:25.797 回答
0

尽管 bean 由 Spring 管理,但您也可以自己创建一个新 bean,而不是从 Spring 容器中获取它。

所以下面的代码将创建一个新用户,但它不是从 Spring 上下文中获取的。

User user = new User()

如果您使用上面的代码,@value则不适用于您的 bean。

如果您愿意,您必须通过 @Autowired 从 Spring 获取用户

public class SampleService{

@Autowired
private User user;

public void Sample(){
user.getExtDir(); //here user.extDir is not null

}

}

于 2013-11-19T20:41:05.940 回答
0

您是否传递了有效的值表达式?对于属性占位符,您可以使用以下内容:

@Value("${directory.extDirectory}")

您还可以使用 Spring EL 并通过查看此处的文档来从中获得所有好处#{value}

如果找不到该属性,也可以分配默认值

@Value("${directory.extDirectory:defaultValue}")
于 2013-07-29T14:36:36.013 回答