Я следил за этим весной Boot + Angular Rutorial на YouTube, который использует Spring Security и JSON Web Tokens (JWT) для аутентификации пользователя. Однако я подошел к точке в видео, где у меня есть ошибка в моем классе JWTutil2. По какой -то причине, когда я пытаюсь запустить свое весеннее приложение, я получаю эту ошибку: < /p>
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)
< /code>
Также, если я посмотрю на класс jwtutil2, он имеет красную линию под параметром, который поставляется в метод jwts.builder (). signwith () в строке 41. Если я завис над ошибкой, он говорит: не может разрешить метод 'signwith (java.security.privatekey)' < /p>
@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");
}
}
}
< /code>
Теперь я фактически нашел способ исправить ошибку, изменив зависимости Maven в файле POM. Я посмотрел на репозиторий Github Учебного пособия на YouTube для видео и скопировал следующие зависимости JWT и прокомментировал мою первоначальную зависимость JWT: < /p>
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">
4.0.0
rubbish-rewards
rubbish-rewards-api
1.0-SNAPSHOT
org.springframework.boot
spring-boot-starter-parent
2.3.0.RELEASE
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-data-jpa
mysql
mysql-connector-java
runtime
org.springframework.boot
spring-boot-starter-security
io.jsonwebtoken
jjwt-api
0.10.5
io.jsonwebtoken
jjwt-impl
runtime
0.10.5
io.jsonwebtoken
jjwt-jackson
runtime
0.10.5
javax.xml.bind
jaxb-api
2.3.0
< /code>
Хотя это решает первую проблему, вводит новую проблему, когда я пытаюсь запустить свое приложение. На этот раз у него есть ошибка, которая считывает: < /p>
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
< /code>
Я бы опубликовал код в мои классы аутентификации и аутентификационные классы, но я чувствую, что это сделает этот вопрос слишком загроможденным. Итак, вместо этого приведена ссылка на мои приложения Github Repository. Если бы кто -нибудь мог помочь, я бы это признал.
Подробнее здесь: https://stackoverflow.com/questions/628 ... d-signwith