Я следил за этой весенней загрузкой + angular учебником на YouTube , который использует Spring Security и JSON веб-токены (JWT) для аутентификации пользователя. Однако я дошел до момента в видео, где у меня есть ошибка в моем классе jwtUtil2. По какой-то причине всякий раз, когда я пытаюсь запустить свое весеннее приложение, я получаю эту ошибку:
Error:(41, 17) java: no suitable method found for signWith(java.security.PrivateKey)
method io.jsonwebtoken.JwtBuilder.signWith(io.jsonwebtoken.SignatureAlgorithm,byte[]) is not applicable
(actual and formal argument lists differ in length)
method io.jsonwebtoken.JwtBuilder.signWith(io.jsonwebtoken.SignatureAlgorithm,java.lang.String) is not applicable
(actual and formal argument lists differ in length)
method io.jsonwebtoken.JwtBuilder.signWith(io.jsonwebtoken.SignatureAlgorithm,java.security.Key) is not applicable
(actual and formal argument lists differ in length)
Также, если я смотрю на класс jwtUtil2, у него есть красная линия под параметром, который предоставляется Jwts.builder ( ) .signWith () в строке 41. Если я наведу курсор на ошибку, появится сообщение: Невозможно разрешить метод 'signWith (java .security.PrivateKey)'.
@Service
public class JwtUtilTwo
{
private KeyStore keyStore;
@PostConstruct
public void init() {
try
{
keyStore = KeyStore.getInstance("JKS");
InputStream resourceAsStream = getClass().getResourceAsStream("/springblog.jks");
keyStore.load(resourceAsStream, "secret".toCharArray());
}
catch (KeyStoreException | CertificateException | NoSuchAlgorithmException | IOException e)
{
throw new SpringRubbishRewardsException("Exception occurred while loading keystore");
}
}
public String generateToken(Authentication authentication) {
User principal = (User) authentication.getPrincipal();
return Jwts.builder()
.setSubject(principal.getUsername())
.signWith(getPrivateKey()) //ERROR HERE
.compact();
}
private PrivateKey getPrivateKey()
{
try
{
return (PrivateKey) keyStore.getKey("springblog", "secret".toCharArray());
}
catch (KeyStoreException | NoSuchAlgorithmException | UnrecoverableKeyException e)
{
throw new SpringRubbishRewardsException("Exception occurred while retrieving public key from keystore");
}
}
}
Теперь я действительно нашел способ исправить ошибку, изменив зависимости Maven в файле pom. Я просмотрел репозиторий GitHub учебника YouTube для видео и скопировал следующие зависимости JWT и закомментировал свою исходную зависимость JWT:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>rubbish-rewards</groupId>
<artifactId>rubbish-rewards-api</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.0.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!--<dependency> MY ORIGINAL JWT DEPENDENCY
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>-->
<!--NEW JWT DEPENDENCIES FROM THE TUTORIALS GITHUB REPOSITORY -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.10.5</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<scope>runtime</scope>
<version>0.10.5</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<scope>runtime</scope>
<version>0.10.5</version>
</dependency>
<!--==================================================-->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
</dependencies>
</project>
Хотя это устраняет первую проблему, появляется новая проблема, когда я пытаюсь запустить мое приложение. На этот раз у него есть ошибка, которая гласит:
2020-07-14 11:52:35.833 WARN 14616 --- [ main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'authenticateController': Unsatisfied dependency expressed through field 'authenticateService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'authenticateService': Unsatisfied dependency expressed through field 'jwtUtil2'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jwtUtilTwo': Invocation of init method failed; nested exception is rubbishrewards.exceptions.SpringRubbishRewardsException: Exception occurred while loading keystore
Я бы отправил код в свои классы authenticationController и AuthenticationService, но мне кажется, что это сделает этот вопрос слишком загроможденным. Так что вместо вот ссылка на мой репозиторий GitHub приложений .
Вот ссылка на учебник YouTube (с отметкой времени) и ссылка на сопровождающие видео Репозиторий GitHub .
Я новичок в Spring, поэтому понятия не имею, что происходит. Если бы кто-нибудь мог помочь, я был бы признателен.