2016-11-23 42 views
-1

我想从Spring读取文件的属性。不过,我不断得到NullPointerException s。我不确定我做错了什么,因为我已经在我的RestController类中使用@Configuration注释完成了此操作。用Spring读取属性会抛出异常

@Component 
@PropertySource("classpath:recaptcha.properties") 
public class RecaptchaProvider { 

    @Value("${com.xxx.user.recaptcha.verify.secret}") 
    private String secret; 

    @Value("${com.xxx.user.recaptcha.verify.url}") 
    private String serviceUrl; 

    public RecaptchaProvider() { 
    //do nothing 
    } 

    public String getSecret() { 
    return secret; 
    } 

    public String getServiceUrl() { 
    return serviceUrl; 
    } 
} 

而且手机号码类:

@Component 
public class RecaptchaServiceImpl implements RecaptchaService { 

    @Autowired 
    RecaptchaProvider provider; 

    @Override 
    public boolean isCaptchaValid(String response) { 
    String secret = provider.getSecret(); // Nullpointer here 
    String serviceUrl = provider.getServiceUrl(); 

    CaptchaValidation captchaValidator = new CaptchaValidation(); 
    ReCaptchaVerfiyResponse result = 
     captchaValidator.postForCaptchaValidation(secret, response, serviceUrl); 

    return Boolean.valueOf(result.getSuccess()); 
    } 
} 

项目设置:

enter image description here

和我的属性文件中:

com.xxx.user.recaptcha.verify.url=https://www.google.com/recaptcha/api/siteverify 
com.xxx.user.recaptcha.verify.secret=xxxxxxxxxxxx 

除外:

java.lang.NullPointerException 
    at com.xxx.user.recaptcha.impl.RecaptchaServiceImpl.isCaptchaValid(RecaptchaServiceImpl.java:24) 
    at com.xxx.rest.user.impl.UserController.checkReCaptcha(UserController.java:135) 
    at com.xxx.rest.user.impl.UserController.addUser(UserController.java:87) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221) 
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136) 
+1

让我在你的'UserController'你'新RecaptchaServiceImpl()'猜。另外'@ PropertySource'应该放在'@ Configuration'类上,否则它不会有太多的功能。 –

+1

是的,我做RecaptchaServiceImpl captchaservice =新RecaptchaServiceImpl(); 返回captchaservice.isCaptchaValid(captchaResponse); – Maevy

回答

0

好的感谢M.Deinum“guess”我解决了这个问题。我没有意识到我混豆与组件,并忘记了一个“新”弄乱了春天LFC

现在它看起来像这样

@Component 
public class RecaptchaProvider { 

    private String secret; 

    private String serviceUrl; 


    public RecaptchaProvider(String secret, String serviceUrl) { 
    this.secret = secret; 
    this.serviceUrl = serviceUrl; 
    } 

    public String getSecret() { 
    return secret; 
    } 

    public String getServiceUrl() { 
    return serviceUrl; 
    } 
} 

酒店提供

@Configuration 
@PropertySource("classpath:recaptcha.properties") 
public class RecaptchaConfig { 

    @Value("${com.xxx.user.recaptcha.verify.secret}") 
    private String secret; 

    @Value("${com.xxx.user.recaptcha.verify.url}") 
    private String serviceUrl; 

    @Bean 
    public RecaptchaProvider getRecaptchaConfig() { 
    return new RecaptchaProvider(secret,serviceUrl); 
    } 
} 

服务

@Autowired 
    RecaptchaConfig config; 

    @Override 
    public boolean isCaptchaValid(String response) { 
    RecaptchaProvider provider = config.getRecaptchaConfig(); 
    String secret = provider.getSecret(); 
     String serviceUrl = provider.getServiceUrl(); 
     CaptchaValidation captchaValidator = new CaptchaValidation(); 
     ReCaptchaVerfiyResponse result = 
      captchaValidator.postForCaptchaValidation(secret, response, serviceUrl); 

     return Boolean.valueOf(result.getSuccess()); 
    } 
} 

最后在我的控制器中的方法

@Autowired 
    protected RecaptchaServiceImpl recaptchaService; 

    private boolean checkReCaptcha(String captchaResponse){ 
    return recaptchaService.isCaptchaValid(captchaResponse); 
    }