是否可以通过Spring Service获得常数值?

时间:2017-08-23 03:15:57

标签: spring web-services static singleton

我们有一个Web服务,其中一个参数称为origin,并且始终根据数据库中的代码验证此源。

对于我们的每项服务,我都必须验证此代码。此代码不会更改,因此我希望将其保持为常量,但我仍需要验证它以防止客户端发送错误的代码。

基本上我想要的是:

@Service
public class Service {

    @Autowired
    private LogBS logBS;

    // I know this cannot be used in a static context.
    public static final Long CODE = this.logBS.retrieveLogWebServiceCode("webServiceName");

    public void validateOriginCode(final Long origin) {
        if (!origin.equals(CODE)) {
            throw new ServiceException("Wrong origin code!");
       }
   }
}

我知道使用Spring缓存可以做类似的事情,但是可以使用常量吗?

2 个答案:

答案 0 :(得分:2)

我宁愿选择这个:

@Service
public class CodeValidatorService {

    private LogBS logBS;

    private Long CODE;

    @Autowired
    public CodeValidatorService(LogBS logBS){
        this.logBS = logBS;
        CODE = this.logBS.retrieveLogWebServiceCode("webServiceName");
        if (CODE == null){
            throw new ServiceException("Code cannot be read from DB!");
        }
    }

    public void validateOriginCode(final Long origin) {
        if (!origin.equals(CODE)) {
            throw new ServiceException("Wrong origin code!");
       }
   }
}

就像代码审查一样,我更喜欢在构造函数中注入依赖项,而不是直接在字段中使用@Autowired,它使服务可测试。您也可以尝试使用@PostConstruct方法读取代码,但我认为在构造函数中执行此操作会更好,因此您始终可以将服务置于准备状态。

要在其余服务中使用它,请在其上注入CodeValidatorService实例:

@Service
public class OtherService {

    private CodeValidatorService codeValidatorService;

    @Autowired
    public OtherService(CodeValidatorService codeValidatorService){
        this.codeValidatorService = codeValidatorService;
    }

    public void performAction(final Long origin) {
        codeValidatorService.validateOriginCode(origin);
        //do the rest of your logic here
   }
}

另见:

答案 1 :(得分:1)

您可以拥有constantsProvider类

@Component
public class ConstantsProvider {

    @Autowired
    private LogBS logBS;

    private String CODE;

    @PostConstruct
    public void init() {
        CODE = this.logBS.retrieveLogWebServiceCode("webServiceName");
    }

    public String getCode() {
        return CODE;
    }
}

将此代码段添加到Service

@Autowired
private ConstantsProvider constantsProvider;

您可以在服务中使用constantsProvider.getCode()。这样,CODE将是不可变的,而不是在静态上下文中定义。

注意:如果您有更多与此类似的常量,则可以使用更好的方法来定义ConstantsProvider类。如果只有一个,我会坚持上面的实现。

编辑1:

如果在所有服务类中都需要它,请将constantsProvider设为spring bean并在其中初始化CODE。更新了答案