首页 > 解决方案 > 不能访问接口实现类中的公共方法(只能访问接口中声明的方法)

问题描述

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

  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()方法?

我必须在我的界面中声明它吗?

标签: javaspringdependency-injection

解决方案


接口TokenService没有声明方法exampleMethod()。所以你不能调用那个方法。((ResetPasswordTokenServiceImpl)resetPasswordService).exampleMethod();如果resetPasswordServiceResetPasswordTokenServiceImpl. _

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


推荐阅读