我有一个接口和该接口的两个实现。
接口仅包含一种名为generateToken()
在我的实现类ResetPasswordTokenServiceImpl
中,我又添加了一个名为exampleMethod()
的方法。
现在的问题是,当我自动连接控制器类中具有额外方法的服务时,我无法调用exampleMethod()
接口声明:
public interface TokenService {
/**
* Generate verification token for given user.
*
* @param user the user entity
* @return the verification token
*/
public VerificationToken generateToken(User user);
}
第一服务:
@Service(value = "emailTokenService")
public class EmailTokenServiceImpl implements TokenService {
@Value("${email.token.expiration.hours}")
private int expirationIn;
/**
* Generate Token for email verification {@link EmailVerificationToken}
* @return VerificationToken token
*/
@Override
public EmailVerificationToken generateToken(User user) {
EmailVerificationToken token = new EmailVerificationToken();
token.setToken(generateHash());
token.setExpirationDate(getExpirationDate());
token.setUser(user);
return token;
}
第二服务:
@Service(value = "resetPasswordService")
public class ResetPasswordTokenServiceImpl implements TokenService {
@Override
public ResetPasswordToken generateToken(User user) {
ResetPasswordToken token = new ResetPasswordToken();
token.setToken(generateHash());
token.setExpirationDate(getExpirationDate());
token.setUser(user);
return token;
}
public String exampleMethod() {
return "example";
}
控制器(尝试访问exampleMethod()
):
@RestController
@RequestMapping("/api/auth")
public class SecurityController {
private static final Logger logger = LoggerFactory.getLogger(JwtAuthenticationEntryPoint.class);
private AuthenticationManager authenticationManager;
private JwtTokenProvider tokenProvider;
private UserService userService;
private TokenService resetPasswordService;
@Autowired
public SecurityController(
AuthenticationManager authenticationManager,
JwtTokenProvider tokenProvider,
UserService userService,
TokenService resetPasswordService) {
this.authenticationManager = authenticationManager;
this.tokenProvider = tokenProvider;
this.userService = userService;
this.resetPasswordService = resetPasswordService;
}
@GetMapping("/reset-password/{token}")
public ResponseEntity<?> resetPasswordRequest(@PathVariable(value = "token") String token) {
String example = resetPasswordService.exampleMethod();
return new ResponseEntity<>(HttpStatus.OK);
}
为什么我不能调用exampleMethod()
方法?
我必须在我的接口中声明它吗?
答案 0 :(得分:2)
接口TokenService
未声明方法exampleMethod()
。因此,您不能调用该方法。如果((ResetPasswordTokenServiceImpl)resetPasswordService).exampleMethod();
是resetPasswordService
的实例,则必须使用强制转换ResetPasswordTokenServiceImpl
。
如果您将该方法添加到接口,则TokenService
的所有实现都必须实现该方法。例如,EmailTokenServiceImpl
没有声明该方法。
答案 1 :(得分:1)
是的。您的控制器仅知道resetPasswordService
是TokenService
的实现。
您可以将resetPasswordService
转换为ResetPasswordTokenServiceImpl
,但最好在构造函数中显式声明ResetPasswordTokenServiceImpl resetPasswordService
。
不要过度抽象您的代码。只需显式地将TokenService
的所有必要实现作为其实现类。我看不到将每个不同的TokenService
都当作接口实例来获得任何好处。