3
votes

Mybatis - Instruction liée non valide (introuvable)

J'ai créé un nouveau projet en utilisant mybatis pour me connecter à une base de données mysql. Ceci est mon deuxième projet utilisant mybatis donc je le connais mais j'obtiens l'erreur suivante lorsque j'appelle la méthode de sauvegarde:

2019-03-05 10: 08: 01.031 ERREUR 86438 --- [nio- 9905-exec-1] cqfrcResolveRestController: Erreur lors du démarrage du préréglage: Instruction liée non valide (introuvable): com.qlsdistribution.fps.resolverender.data.mybatis.mapper.ResolveJobReportMapper.saveResolveJobReport org.apache.ibatis.binding.BindingException: instruction liée non valide (introuvable): com.qlsdistribution.fps.resolverender.data.mybatis.mapper.ResolveJobReportMapper.saveResolveJobReport à org.apache.ibatis.binding.MapperMethod $ SqlCommand. (MapperMethod.java:232) ~ [mybatis-3.5.0.jar: 3.5.0] à org.apache.ibatis.binding.MapperMethod. (MapperMethod.java:50) ~ [mybatis-3.5.0.jar: 3.5.0] à org.apache.ibatis.binding.MapperProxy.lambda $ cachedMapperMethod $ 0 (MapperProxy.java:62) ~ [mybatis-3.5.0.jar: 3.5.0] à java.util.concurrent.ConcurrentHashMap.computeIfAbsent (ConcurrentHashMap.java:1660) ~ [nd: 1.8.0_101] à org.apache.ibatis.binding.MapperProxy.cachedMapperMethod (MapperProxy.java:62) ~ [mybatis-3.5.0.jar: 3.5.0] .....

Mon fichier de configuration mybatis est le suivant (dans src / main / resources):

@Service("ResolveJobReportService")
public class ResolveJobReportService {

    @Autowired
    private ResolveJobReportMapper resolveJobReportMapper= null;

    public List<ResolveJobReport> getAllResolveJobReports() {
        return resolveJobReportMapper.getAllResolveJobReports();
    }

    public List<ResolveJobReport> getAllResolveJobReports(RowBounds rowBounds) {
        return resolveJobReportMapper.getAllResolveJobReports();
    }

    public List<ResolveJobReport> getAllResolveJobReportsById(Long id) {
        return resolveJobReportMapper.getAllResolveJobReportsById(id);
    }

    public List<ResolveJobReport> getAllResolveJobReportsById(Long id, RowBounds rowBounds) {
        return resolveJobReportMapper.getAllResolveJobReportsById(id);
    }

    public void saveResolveJobReport(ResolveJobReport resolveJobReport) {
        resolveJobReportMapper.saveResolveJobReport(resolveJobReport);
    }

    public void updateResolveJobReportById(ResolveJobReport resolveJobReport) {
        resolveJobReportMapper.updateResolveJobReportById(resolveJobReport);
    }

    public void deleteResolveJobReporttById(Long id) {
        resolveJobReportMapper.deleteResolveJobReporttById(id);
    }

}

Comme vous pouvez le voir, j'ai essayé différents emplacements pour le fichier xml mapper mais si je mets une syntaxe invalide dans le fichier xml mapper, cela échoue avec une syntaxe invalide (SAXParseException) à la place, donc je sais que le fichier xml mapper est en cours de lecture.

est comme suit (dans src / main / resources / mapper):

@Mapper
public interface ResolveJobReportMapper {

    public List<ResolveJobReport> getAllResolveJobReports();

    public List<ResolveJobReport> getAllResolveJobReports(RowBounds rowBounds);

    public List<ResolveJobReport> getAllResolveJobReportsById(Long id);

    public List<ResolveJobReport> getAllResolveJobReportsById(Long id, RowBounds rowBounds);

    public void saveResolveJobReport(ResolveJobReport resolveJobReport);

    public void updateResolveJobReportById(ResolveJobReport resolveJobReport);

    public void deleteResolveJobReporttById(Long id);

}

Mon fichier application.properties contient les éléments suivants (dans (src / main / resources): p >

@SpringBootApplication
@EnableScheduling
@ComponentScan({"com.qlsdistribution.fps.resolverender"})
@EnableJms
@MapperScan("com.qlsdistribution.fps.resolverender.data.mybatis")
public class FPSResolveRenderApp implements WebMvcConfigurer {
    /** UTF-8 Character set name */
    private static final String UTF_8 = "UTF-8";

    /** Logger */
    private static final Logger logger = LogManager.getLogger(FPSResolveRenderApp.class);

    public static void main(String[] args) {
        new SpringApplicationBuilder(FPSResolveRenderApp.class).run(args);

    }

    /**
     * Creates and gets the FilterRegistrationBean
     * @return
     */
    @Bean
    public FilterRegistrationBean<CharacterEncodingFilter> filterRegistrationBean() {
        FilterRegistrationBean<CharacterEncodingFilter> registrationBean = new FilterRegistrationBean<CharacterEncodingFilter>();
        CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
        characterEncodingFilter.setEncoding(UTF_8);
        registrationBean.setFilter(characterEncodingFilter);
        return registrationBean;
    }
}

J'ai même essayé d'utiliser les dernières versions de mybatis dans mon pom.xml:

    <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.0</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
        <version>2.0.0</version>
    </dependency>
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.0.0</version>
    </dependency>

Mon application Spring Boot est la suivante:

spring.datasource.url=jdbc:mysql://localhost:3306/fpsresolvetool?createDatabaseIfNotExist=true&autoReconnect=true&useSSL=false
spring.datasource.username=root
spring.datasource.password=
spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
spring.datasource.schema=classpath:schema.sql

mybatis.config-location=classpath:SqlMapConfig.xml

L'interface du mappeur est la suivante:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.qlsdistribution.fps.resolverender.data.mybatis.ResolveJobReportMapper">

    <resultMap id="resolveJobReport" type="com.qlsdistribution.fps.resolverender.data.mybatis.domain.ResolveJobReport">
        <result property="id" column="id" />
        <result property="fpsProjectName" column="fps_project_name" />
        <result property="inputPath" column="input_path" />
        <result property="destinationPath" column="destination_path" />
        <result property="presetName" column="preset_name" />
        <result property="ipAddress" column="ip_address" />
        <result property="frameRate" column="frame_rate" />
        <result property="resolveProjectName" column="resolve_project_name" />
        <result property="width" column="width" />
        <result property="height" column="height" />
        <result property="renderFormat" column="render_format" />
        <result property="renderCodec" column="render_codec" />
        <result property="scriptPath" column="script_path" />
        <result property="cliOutput" column="cli_output" />
        <result property="jobStartedDate" column="job_started_date" />
        <result property="jobFinishedDate" column="job_finished_date" />
        <result property="createdBy" column="created_by" />
        <result property="createdDate" column="created_date" />
        <result property="modifiedBy" column="modified_by" />
        <result property="modifiedDate" column="modified_date" />
    </resultMap>

    <select id="getAllResolveJobReports" resultMap="resolveJobReport">
        SELECT id, fps_project_name, input_path, destination_path, preset_name, ip_address, frame_rate, resolve_project_name, width, height, 
        render_format, render_codec, script_path, cli_output, job_started_date, job_finished_date, created_by, created_date, modified_by, modified_date
        FROM resolve_job_report
        WHERE fps_setting_id = #{value}
        ORDER by id desc;
    </select>

    <select id="getAllResolveJobReportsById" parameterType="Long"  resultMap="resolveJobReport">
        SELECT id, fps_project_name, input_path, destination_path, preset_name, ip_address, frame_rate, resolve_project_name, width, height, 
        render_format, render_codec, script_path, cli_output, job_started_date, job_finished_date, created_by, created_date, modified_by, modified_date
        FROM resolve_job_report
        WHERE id = #{value};
    </select>

    <insert id="saveResolveJobReport" parameterType="com.qlsdistribution.fps.resolverender.data.mybatis.domain.ResolveJobReport">
        INSERT INTO resolve_job_report 
        (fps_project_name, input_path, destination_path, preset_name, ip_address, frame_rate, resolve_project_name, width, height, 
        render_format, render_codec, script_path, cli_output, job_started_date, job_finished_date, created_by)
        VALUE 
        (#{fpsProjectName},#{inputPath},#{destinationPath},#{presetName},#{ipAddress},#{frameRate},#{resolveProjectName},#{width},#{height},
        #{renderFormat},#{renderCodec}, #{scriptPath},#{cliOutput},#{jobStartedDate},#{jobFinishedDate},#{createdBy});
    </insert>

    <update id="updateResolveJobReportById" parameterType="resolveJobReport">
        UPDATE resolve_job_report
        SET
        fps_project_name = #{fpsProjectName}, 
        input_path = #{inputPath}, 
        destination_path = #{destinationPath}, 
        preset_name = #{presetName}, 
        ip_address = #{ipAddress}, 
        frame_rate = #{frameRate}, 
        resolve_project_name = #{resolveProjectName}, 
        width = #{width}, 
        height = #{height}, 
        render_format = #{renderFormat}, 
        render_codec = #{renderCodec}, 
        script_path = #{scriptPath}, 
        cli_output = #{cliOutput}, 
        job_started_date = #{jobStartedDate}, 
        job_finished_date = #{jobFinishedDate},
        modified_by = #{modifiedBy}
        where id = #{id};
    </update>

    <delete id="deleteResolveJobReporttById" parameterType="Long">
        DELETE FROM resolve_job_report
        WHERE id = #{value}
    </delete>
</mapper>

Et la classe de service est la suivante:

XXX

Quelqu'un peut-il voir ce qui ne va pas?


0 commentaires

4 Réponses :


5
votes

Le problème se produit car l ' namespace dans mapper xml est com.qlsdistribution.fps.resolverender.data.mybatis.ResolveJobReportMapper mais le package l'interface du mappeur est com.qlsdistribution.fps.resolverender.data.mybatis.mapper.ResolveJobReportMapper .

Pour résoudre ce problème, assurez-vous qu'ils correspondent.


0 commentaires

1
votes

J'ai eu le même message d'erreur lorsque j'ai changé mon projet d'un projet JavaFX à un projet Maven.

J'ai dû déplacer tous mes fichiers xml mapper vers le dossier de ressources. Après cela, a très bien fonctionné.


0 commentaires

0
votes

J'ai rencontré ce problème récemment et j'ai vérifié tout ce qui peut être trouvé sur Internet. Ça m'a coûté une journée entière.

Enfin j'ai mis les fichiers xml au même endroit avec les fichiers java de l'interface, ce qui a résolu le problème.

Je pense que c'est parce que pour certaines raisons, les fichiers xml ne peuvent pas être trouvés, et leur mise en place les rend visibles.


0 commentaires

0
votes

J'ai eu le même problème

Pour moi, le correctif donnait le même nom de fichier pour le java (classe d'interface mapper) et le fichier xml correspondant


0 commentaires