@Value返回null

时间:2013-07-29 13:53:29

标签: spring spring-mvc annotations jpa-2.0

我的实体类中有几个@Value注释。我不确定为什么,但他们都返回null。我也有" ShaPasswordEncoder"对象自动装配,也是抛出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 个答案:

答案 0 :(得分: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) {
       // ...
   }
}

答案 1 :(得分:0)

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

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

您还可以使用Spring {#{value} check the docs here

来使用Spring EL并获得所有优点

如果找不到属性,也可以指定默认值

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

答案 2 :(得分: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;
}

答案 3 :(得分: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

}

}