无法访问接口实现类中的公共方法(仅访问接口中声明的方法)

时间:2019-05-25 20:00:22

标签: java spring dependency-injection

我有一个接口和该接口的两个实现。

  1. EmailTokenServiceImpl
  2. ResetPasswordTokenServiceImpl

接口仅包含一种名为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()方法?

我必须在我的接口中声明它吗?

2 个答案:

答案 0 :(得分:2)

接口TokenService未声明方法exampleMethod()。因此,您不能调用该方法。如果((ResetPasswordTokenServiceImpl)resetPasswordService).exampleMethod();resetPasswordService的实例,则必须使用强制转换ResetPasswordTokenServiceImpl

如果您将该方法添加到接口,则TokenService的所有实现都必须实现该方法。例如,EmailTokenServiceImpl没有声明该方法。

答案 1 :(得分:1)

是的。您的控制器仅知道resetPasswordServiceTokenService的实现。

您可以将resetPasswordService转换为ResetPasswordTokenServiceImpl,但最好在构造函数中显式声明ResetPasswordTokenServiceImpl resetPasswordService

不要过度抽象您的代码。只需显式地将TokenService的所有必要实现作为其实现类。我看不到将每个不同的TokenService都当作接口实例来获得任何好处。