从特定类调用时,@Value 注释不会从属性文件中获取属性。
属性配置:
@Configuration
@PropertySource(value = "classpath:s_app.properties")
@PropertySource(value = "classpath:sDBpools.properties")
public class PropertiesConfig {
}
当我从 ProjectInfoServiceImpl 类调用属性时,它会返回但不能从 JwtTokenUtil 类中工作。
secret在这里返回 null:
@Component
@Log4j2
public class JwtTokenUtil implements Serializable {
private static final long serialVersionUID = -1L;
private static final int EXPIRATION_MILLISECONDS = 60 * 60 * 1000;
@Value("${info.app.jwt.secret}")
private String secret;
public String generateToken(User user){
Map<String, Object> claims = new HashMap<>();
claims.put("authorities", user.getAuthorities());
return generateToken(user.getUsername(), claims);
}
public String generateToken(UserDetails userDetails){
Map<String, Object> claims = new HashMap<>();
claims.put("authorities", userDetails.getAuthorities());
return generateToken(userDetails.getUsername(), claims);
}
public String generateToken(String username, Map<String, Object> claims) {
return Jwts.builder()
.setSubject(username)
.setClaims(claims)
.setExpiration(new Date((System.currentTimeMillis() + EXPIRATION_MILLISECONDS)))
.setIssuedAt(new Date())
.signWith(SignatureAlgorithm.HS256, secret)
.compact();
}
public boolean validateToken(String username, String token){
return (username.equals(getUsernameFromToken(token)) && !isExpired(token));
}
public String getUsernameFromToken(String token) {
return getClaimFromToken(token, Claims::getSubject);
}
public Date getExpirationdateFromToken(String token){
return getClaimFromToken(token, Claims::getExpiration);
}
public boolean isExpired(String token){
return !(new Date().before(getExpirationdateFromToken(token)));
}
public <T> T getClaimFromToken(String token, Function<Claims, T> claimsResolver) {
final Claims claims = getAllClaimsFromToken(token);
return claimsResolver.apply(claims);
}
private Claims getAllClaimsFromToken(String token) {
return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();
}
}
但在这里它按预期返回:
@Service
@Log4j2
public class ProjectInfoServiceImpl implements ProjectInfoService {
@Value("${info.app.jwt.secret}")
private String secret;
@Value("${s.version}")
private String version;
@Value("${s.deployment.profile}")
private String deploymentProfile;
@Value("${s.deployment.environment}")
private String deploymentEnvironment;
@Override
public ProjectInfoDTO getProjectInfo() {
ProjectInfoDTO projectInfoDTO = new ProjectInfoDTO();
projectInfoDTO.setVersion(version);
projectInfoDTO.setDeploymentProfile(deploymentProfile);
projectInfoDTO.setDeploymentEnvironment(deploymentEnvironment);
return projectInfoDTO;
}
}
这是文件夹结构:
此外,执行器不会从 s_properties 文件的 info.app.version 属性中获取信息。/info 端点不返回任何信息,因为它找不到该属性。