У меня есть проект SpringBoot 2.x + Weblogi c 12.x + *. War + Spring MVC
пом. xml
Это зависимости.
...
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web-services</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency><!--mapstruct -->
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${version.mapstruct}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
....
Точка входа в приложение
@SpringBootConfiguration
/*@EnableAutoConfiguration
@ComponentScan*/
//@EnableJpaRepositories(basePackages = "weblogic.war.spring.boot.dao.repository")
@SpringBootApplication
public class WebSpringBootJarApplication
extends SpringBootServletInitializer
implements WebApplicationInitializer {
public static void main(String[] args) {
SpringApplication.run(WebSpringBootJarApplication.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(WebSpringBootJarApplication.class);
}
}
Хранилище
public interface CompanyReadRepository extends CrudRepository<Company, Long> {
Optional<Company> findByName(String name);
}
Служба
@Service
public class CompanyReadServiceImpl implements CompanyReadService {
private CompanyMapper companyMapper;
private CompanyReadRepository companyReadRepository;
@Autowired
public CompanyReadServiceImpl(CompanyMapper companyMapper,
CompanyReadRepository companyReadRepository) {
this.companyMapper = companyMapper;
this.companyReadRepository = companyReadRepository;
}
@Override
public CompanyDto getById(Long id) {
Company company = find(id);
return transform(company);
}
@Transactional
@Override
public boolean isByName(String name) {
return this.companyReadRepository.findByName(name).isPresent();
}
@Transactional
@Override
public CompanyDto getByName(String name) {
Company company = companyReadRepository.findByName(name).orElse(new Company());
return transform(company);
}
private Company find(Long id){
Optional<Company> byId = this.companyReadRepository.findById(id);
return this.companyReadRepository.findById(id).orElseThrow(() -> new RuntimeException("user not found."));
}
private CompanyDto transform(Company company){
return this.companyMapper.companyToCompanyDto(company);
}
}
Когда я отправляю запрос в хранилище
private Company find(Long id){
Optional<Company> byId = this.companyReadRepository.findById(id);
return this.companyReadRepository.findById(id).orElseThrow(() -> new RuntimeException("User not found"));
}
Необязательно byId = this.companyReadRepository.findById (id); - эта строка в методе является избыточной, эта строка предназначена только для иллюстративных целей ...
private CompanyReadRepository companyReadRepository; Я заполнен.
Этот объект не нуль ...
Затем я получаю ( this.companyReadRepository.findById (id); ) в качестве ответа ' Optional.empty ...'
Но если я использую встроенный Tomcat, все работает нормально.
Почему?
У кого-нибудь есть идеи, как это исправить?
РЕШЕНИЕ
- Сначала нам нужно правильно application.properties
spring.datasource.url=jdbc:h2:file:${user.dir}/database/cars;DB_CLOSE_ON_EXIT=FALSE;DB_CLOSE_DELAY=-1;
Во время запуска мы получим ошибку:
База данных, возможно, уже используется: ноль. Возможные решения: закрыть все другие соединения; использовать режим сервера [90020-200
Это происходит потому, что мы используем внешний сервер (в моем случае это weblogi c 12.x). Если вы используете встроенный tomcat в SpringBoot, то вышеуказанная настройка работает.
Я должен сделать эту настройку
Не ясно, зачем вам нужно перемещать базу данных в этот каталог (это не относится к тестовой области, вышеуказанная настройка будет работать там)
spring.datasource.url=jdbc:h2:file:c:/oracle_home_develop/user_projects/domains/base_domain/database/cars;DB_CLOSE_ON_EXIT=TRUE;
для тестовой области
spring.datasource.url=jdbc:h2:file:${user.dir}/database/cars-test;DB_CLOSE_ON_EXIT=FALSE;DB_CLOSE_DELAY=-1;
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=root
spring.datasource.password=
Если кто-нибудь знает, объясните, почему это работает только так?
Может быть, это связано только с СУБД H2?
Ответ
Я пытался использовать базу данных orcalde. Там сработало правильно.