많은 시간을 연구하고 올바른 해결책을 찾지 못해서 누군가가 나를 도울 수 있기를 바랍니다.봄 부팅 Jar가 데이터베이스에 액세스 할 수 없습니다. - NullPointerException
MySQL 데이터베이스에 액세스하는 스프링 부팅 응용 프로그램을 만듭니다. 내가
mvn spring-boot:run
그것을 실행하는 경우
모두 잘 작동합니다. 내가
mvn clean package
사용하여 응용 프로그램을 패키지화하는 경우
는하지만 NullPointerException이 얻을 :
java.lang.IllegalStateException: Failed to execute CommandLineRunner
at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:803) [spring-boot-1.4.1.RELEASE.jar!/:1.4.1.RELEASE]
at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:784) [spring-boot-1.4.1.RELEASE.jar!/:1.4.1.RELEASE]
at org.springframework.boot.SpringApplication.afterRefresh(SpringApplication.java:771) [spring-boot-1.4.1.RELEASE.jar!/:1.4.1.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:316) [spring-boot-1.4.1.RELEASE.jar!/:1.4.1.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1186) [spring-boot-1.4.1.RELEASE.jar!/:1.4.1.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1175) [spring-boot-1.4.1.RELEASE.jar!/:1.4.1.RELEASE]
at de.conbord.trms.Application.main(Application.java:20) [classes!/:1.0-SNAPSHOT]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_102]
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_102]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_102]
at java.lang.reflect.Method.invoke(Unknown Source) ~[na:1.8.0_102]
at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48) [trms-1.0-SNAPSHOT.jar:1.0-SNAPSHOT]
at org.springframework.boot.loader.Launcher.launch(Launcher.java:87) [trms-1.0-SNAPSHOT.jar:1.0-SNAPSHOT]
at org.springframework.boot.loader.Launcher.launch(Launcher.java:50) [trms-1.0-SNAPSHOT.jar:1.0-SNAPSHOT]
at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:58) [trms-1.0-SNAPSHOT.jar:1.0-SNAPSHOT]
Caused by: java.lang.NullPointerException: null
at de.conbord.trms.controller.TokenBuilder.createToken(TokenBuilder.java:17) ~[classes!/:1.0-SNAPSHOT]
at de.conbord.trms.api.CheckToken.createNewToken(CheckToken.java:66) ~[classes!/:1.0-SNAPSHOT]
at de.conbord.trms.api.CheckToken.checkValidToken(CheckToken.java:41) ~[classes!/:1.0-SNAPSHOT]
at de.conbord.trms.controller.TokenLoader.run(TokenLoader.java:41) ~[classes!/:1.0-SNAPSHOT]
at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:800) [spring-boot-1.4.1.RELEASE.jar!/:1.4.1.RELEASE]
... 14 common frames omitted
에서 응용 프로그램이 데이터베이스에 액세스 할 수 있다고 생각을, 나는 액세스 거부 오류가 발생하지 않는 원인, 그러나 그것의 자료를 얻을 수 없다. 여기에 완성도를 들어
, 내 pom.xml 파일
<?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>de.conbord</groupId>
<artifactId>trms</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.1.RELEASE</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<packaging>jar</packaging>
<dependencies>
<!-- Spring Boot JPA -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>
<!-- lombock -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.8</version>
</dependency>
<!-- Thymeleaf -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>false</optional>
</dependency>
<!-- Apache Commons -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.5</version>
</dependency>
<!-- Spring Boot Security -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!-- MySQL Connector -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.40</version>
</dependency>
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.9.4</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>1.4.1.RELEASE</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
CheckToken.java
@Component
public class CheckToken {
private final ConfigurationRepository repository;
private final TokenRepository tokenRepository;
private static final Logger log = LoggerFactory.getLogger(Application.class);
@Autowired
public CheckToken(ConfigurationRepository repository, TokenRepository tokenRepository) {
this.repository = repository;
this.tokenRepository = tokenRepository;
}
public void checkValidToken() {
Configuration configuration = this.repository.findByUserName("ADI");
Token token = this.tokenRepository.findOne(1L);
if (token == null) {
token = createNewToken(configuration);
this.tokenRepository.save(token);
} else {
Long tokenId = token.getId();
Pattern pattern = Pattern.compile("(\\d+)");
Matcher matcher = pattern.matcher(token.getValidTo());
if (matcher.find()) {
Long endDate = Long.parseLong(matcher.group(1));
Date tokenEndDate = new Date(endDate);
Date currentDate = Calendar.getInstance().getTime();
if (currentDate.after(tokenEndDate)) {
TokenBuilder tokenBuilder = new TokenBuilder();
token = tokenBuilder.createToken(configuration);
token.setId(tokenId);
this.tokenRepository.save(token);
}
}
}
}
private Token createNewToken(Configuration configuration) {
TokenBuilder tokenBuilder = new TokenBuilder();
Token token = tokenBuilder.createToken(configuration);
token.setId(1L);
return token;
}
}
TokenBuilder.java
package de.conbord.trms.controller;
import de.conbord.trms.entity.Configuration;
import de.conbord.trms.entity.Token;
import org.springframework.http.HttpEntity;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;
public class TokenBuilder {
public Token createToken(Configuration configuration) {
String authString = "SIP sip_username=" + configuration.getUserName()
+ " sip_password=" + configuration.getUserPasswort()
+ " sip_database=" + configuration.getDbName()
+ " app_key=" + configuration.getAppGUID();
String jsonObject = "{\"AppliesTo\":\"localhost:808/staffitprowebAPI/\", \"TokenType\":\"http://staffITpro.com/tokens/staffITproSecurityToken/type\"}";
String url = configuration.getUrl() + "Token/";
MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
headers.add("Accept", "application/json");
headers.add("Content-Type", "application/json");
headers.add("Authorization", authString);
RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
HttpEntity<String> request = new HttpEntity<>(jsonObject, headers);
return restTemplate.postForObject(url, request, Token.class);
}
}
구성 개체가 데이터베이스에 저장됩니다.
그래서 지금 jar에서 응용 프로그램을 시작하면 왜이 예외가 발생하는지 이해할 수 없습니다.
왜 병에서 데이터베이스의 구성에 액세스 할 수 없습니까?
@ Tunaki 당신이 설명 할 수있는 이유는 그것이 다른 질문의 정확한 사본입니까? 내 질문은 왜 응용 프로그램을 jar 파일로 실행할 때 NullPointerException이 발생하는지입니다. Maven을 실행하면 작동합니다. – Waysti
당신은 그것을 정확히 어디에서 읽었습니까? 뭔가 응용 프로그램에서'null', 당신은 무엇인지 찾아야하고, 응용 프로그램을 디버깅해야합니다. 이 질문에있는 정보로 누군가가 당신을 도울 수는 없습니다. 이 예외의 원인과 해결책을 찾으려면 링크 된 질문을 참조하십시오. – Tunaki
죄송합니다, 정확한 duplicat 복사하지 마십시오. 내 잘못. 나는 'null'이 무엇인지 압니다. 설정 객체는'null'입니다. 응용 프로그램을 시작하면 구성을로드하고 구성 개체에 저장합니다. 그런 다음 새 토큰을 만듭니다. 그리고이를 위해서는 Configuration Object가 필요합니다. 그래서'mvn spring-boot : run'으로 데이터베이스로부터 데이터를 얻습니다.하지만'mvn clean package'로 패키징하고 jar'java -jar trms-1.0-SNAPHOT.jar'로 실행하면 얻을 수 없습니다. 데이터베이스에서. 어쩌면 메이븐 (maven)이 그 외에 무엇인가 할 수 있을까요? – Waysti