Это не возможно через findById () запись с SpringDataJpa + SpirngBoot 2.x - PullRequest
0 голосов
/ 28 февраля 2020

У меня есть проект 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. Там сработало правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...