весенняя загрузка javax persistance javax.persistence.PersistenceContext.synchronization () Ljavax / persistence / SynchronizationType; - PullRequest
0 голосов
/ 06 августа 2020

Я создаю приложение весенней загрузки, как только я запускаю свое приложение, у меня возникает следующая ошибка:

Вызвано: java .lang.NoSuchMethodError: javax.persistence.PersistenceContext.synchronization () Ljavax / persistence / SynchronizationType; в org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor $ PersistenceElement. (PersistenceAnnotationBeanPostProcessor. java: 671) в org.springframework.orm.jpa.support.PersistenceAnnotationAnnotationBean по адресу org.springframework.util.ReflectionUtils.doWithLocalFields (ReflectionUtils. java: 668) по адресу org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.buildPersistenceMetadata (PersistenceAnnotationBeanPostProcessor.buildPersistenceMetadata (PersistenceAnnotationBext). (. PersistenceAnnotationBeanPostProcessor * * тысяча двадцать-семь: 409) .support.PersistenceAnnotationBeanPostProcessor.findPersistenceMetadata на org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.postProcessMergedBeanDefinition (. PersistenceAnnotationBeanPostProcessor java: 336) в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory .applyMergedBeanDefinitionPostProcessors (AbstractAu TowireCapableBeanFactory. java: 1093) в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory. java: 568) ... еще 44 1005 * 100 * 100 *: 568 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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>nanosense-usine</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>nanosense-usine</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>11</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <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>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
        </dependency>

        <!-- test -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>test</scope>
        </dependency>

        <!-- utilities -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.9.2</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.9.2</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

мои файлы:

package com.example.nanosenseusine.controller;

import com.example.nanosenseusine.commons.exceptions.ApiExceptionModel;
import com.example.nanosenseusine.commons.exceptions.RequestExceptions;
import com.example.nanosenseusine.model.dto.AppKeysDtoModel;
import com.example.nanosenseusine.service.AppKeysService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/appKeys")
public class AppKeysController {

    public final AppKeysService appKeysService; // service pour appKeys

    @Autowired
    public AppKeysController(AppKeysService appKeysService) {
        this.appKeysService = appKeysService;
    }

    /**
     * écris une A
     * @param userBody le modèle à ajouter dans la bdd
     * @return l'entité ajoutée par l'utilisateur
     */
    @ApiResponses(value = {
            @ApiResponse(code = 201, message = "Succès", response = AppKeysDtoModel.class),
            @ApiResponse(code = 400, message = "Paramètres invalides", response = ApiExceptionModel.class),
            @ApiResponse(code = 500, message = "Erreur interne", response = ApiExceptionModel.class)
    })
    @PostMapping(consumes = "application/json", produces =  "application/json")
    public ResponseEntity<AppKeysDtoModel> postAppKey(@RequestBody AppKeysDtoModel userBody)
            throws RequestExceptions.Exception400, RequestExceptions.Exception500 {
        AppKeysDtoModel body = appKeysService.post(userBody);
        return ResponseEntity.status(HttpStatus.CREATED).body(body);
    }
}

@Service
@Slf4j
public class AppKeysService {

    public final AppKeysConverter converter;
    public final AppKeysDao appKeysDao; // pour les opérations sur la bdd

    private static final String BAD_USER_REQUEST = "one of more elements in the request are missing";

    @Autowired
    public AppKeysService(AppKeysConverter converter, AppKeysDao appKeysDao) {
        this.converter = converter;
        this.appKeysDao = appKeysDao;
    }

    /**
     * ajout d'une AppKey dans la bdd (Lora)
     * @param dto les paramètres récupérées dans le body du post
     */
    public AppKeysDtoModel post(final AppKeysDtoModel dto) throws RequestExceptions.Exception400, RequestExceptions.Exception500 {
        if (dto == null || dto.getModel() == null || dto.getFirmwareVersion() == null) {
            throw new RequestExceptions.Exception400(BAD_USER_REQUEST);
        }
        AppKeysDaoModel entity_to_push = converter.ConvertFromDtoToDaoModel(dto);

        // on récupère le dernier element de la bdd pour incrémenter 'AppKey' et 'DevEui' en fonction de l'élement précedent
        var last_element = appKeysDao.get_last_element();
        if (last_element == null)
            last_element = new AppKeysDaoModel();
        // on incrémente les valeurs à ajouter dans la bdd
        entity_to_push.setAppEui(GlobalClass.APPEUI_DEFAULT);
        entity_to_push.setAppKey(BytesOperations.addHexaValue(last_element.getAppKey(), GlobalClass.APPKEY_SHIFT));
        entity_to_push.setAppEui(BytesOperations.addHexaValue(last_element.getAppEui(), GlobalClass.APPEUI_SHIFT));
        return converter.ConvertFromDaoToDtoModel(appKeysDao.push(entity_to_push)); // récupère la réponse après le post puis le convertis en dto
    }
}


package com.example.nanosenseusine.dao;

import com.example.nanosenseusine.model.dao.AppKeysDaoModel;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.springframework.stereotype.Component;

@Slf4j
@Component
public class AppKeysDao extends BasicDao<AppKeysDaoModel>{
    @Override
    protected Class<AppKeysDaoModel> getDaoModelClass() {
        return AppKeysDaoModel.class;
    }

    @Override
    protected Logger getLogger() {
        return log;
    }
}


public abstract class BasicDao<T extends BasicDaoModel> {

    @PersistenceContext
    protected EntityManager entityManager;

    /**
     * ajoute une entité dans la bdd
     * @return l'entité ajoutée
     */

    public T push(T entity_to_push){
        try {
            entityManager.persist(entity_to_push);
            return entity_to_push;
        } catch (Exception e){
            getLogger().error("Persistance error: " + getClass().getName(), e);
            throw new RequestExceptions.Exception500();
        }
    }

    public T get_last_element(){
        try {
            var query = entityManager.createQuery("SELECT d from " + getDaoModelClass().getName() + " d ORDER BY d.id")
                    .setMaxResults(1).getResultList(); // crée la query
            return (query == null)? null : (T) query.get(0);
        } catch (ClassCastException e){
            getLogger().error("erreur de conversion de classe: " + getClass().getName(), e);
            throw new RequestExceptions.Exception500();
        }
        catch(Exception e){
            getLogger().error("Persistance error: " + getClass().getName(), e);
            throw new RequestExceptions.Exception500();
        }
    }

    protected abstract Class<T> getDaoModelClass();
    protected abstract Logger getLogger();
}

Похоже, проблема является постоянной. В свойствах моего приложения я установил следующие правила:

server.port=8181

## default connection pool
spring.datasource.hikari.connectionTimeout=20000
spring.datasource.hikari.maximumPoolSize=5

## PostgreSQL
spring.datasource.url=jdbc:postgresql://localhost:5432/nanosenseUsine
spring.datasource.username=postgres
spring.datasource.password=postgres

Между прочим, ошибка не появляется, когда я удаляю из своего pom зависимость spring-boot-starter-data-jpa или @PersistenceContext аннотация из BasicDao

Я искал такие ошибки в net, это могло быть из-за проблемы с зависимостью, но я удалил их все и повторно импортировал, но ошибка все равно возникает. Есть ли у кого-нибудь есть идея об этом?

...