我们有一个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缓存可以做类似的事情,但是可以使用常量吗?
答案 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
。更新了答案