Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    Problema con MyBatis e file di configurazione

    ciao!

    sto provando ad usare MyBatis, ma ho un problema sul dove piazzare / leggere il file di configurazione generale.
    io l'ho creato dentro ad un package, lo stesso dove ho la classe MyBatisUtils:
    codice:
    public class MyBatisUtils {
    
        private static SqlSessionFactory factory;
    
        static {
            String myBatisConfig = "/run/media/matte/MATTE8/Project/JAVA/TestMaven/src/main/java/com/mp/testmaven/mybatis-config.xml";
            
            File f = new File(myBatisConfig);
            System.out.println(f.exists());
            
            Reader reader = null;
            try {
                reader = Resources.getResourceAsReader(myBatisConfig);
            } catch (IOException e) {
                System.out.println(e.getMessage());
            }
            factory = new SqlSessionFactoryBuilder().build(reader);
        }
    
        public static SqlSessionFactory getSqlSessionFactory() {
            return factory;
        }
    }
    facendo un test con JUnit, incappo sempre in questo:
    codice:
    true
    Could not find resource /run/media/matte/MATTE8/Project/JAVA/TestMaven/src/main/java/com/mp/testmaven/mybatis-config.xml
    quindi, mi ritoran true perchè il file lo trova.
    ma poi mi da quell'errore.

    a questo punto non capisco bene dove sto sbagliando.
    e soprattutto, dove dovrei mettere quel file per nn passargli tutto il path completo.

    questo il JUnit test (è la prima volta che lo uso):
    codice:
    public class UtenteServiceTest {
    
    //    private static UtenteService us;
    
        @BeforeClass
        public static void setUpClass() {
        }
    
        @AfterClass
        public static void tearDownClass() {
        }
    
        @Test
        public void testGetUtenti() {
            MyBatisUtils mb = new MyBatisUtils();
        }
    
    }

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da fermat Visualizza il messaggio
    codice:
            String myBatisConfig = "/run/media/matte/MATTE8/Project/JAVA/TestMaven/src/main/java/com/mp/testmaven/mybatis-config.xml";
    Innanzitutto non ha senso che metti "cablato" nel sorgente tutto un path che è specifico solo della tua macchina (che tra l'altro non funziona di certo con quel getResourceAsReader).
    Poi comunque stai usando Maven, quindi file di configurazione, dati, immagini ecc.. che "fanno parte" fissa della applicazione andrebbero messi sotto src/main/resources .... non sotto src/main/java.

    Quello che c'è sotto resources è poi "in classpath" a runtime. Quindi con getResourceAsReader a quel punto basta:

    String myBatisConfig = "com/mp/testmaven/mybatis-config.xml";
    Ultima modifica di andbin; 18-12-2016 a 12:22
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    allora, ho spostato il file mybatis-config.xml in src/main/resources.

    e poi ho cambiato così:
    codice:
    public class MyBatisUtils {
    
        private static SqlSessionFactory factory;
    
        static {
            String myBatisConfig = "mybatis-config.xml";
            Reader reader = null;
            try {
                reader = Resources.getResourceAsReader(myBatisConfig);
            } catch (IOException e) {
                System.out.println(e.getMessage());
            }
            factory = new SqlSessionFactoryBuilder().build(reader);
        }
    
        public static SqlSessionFactory getSqlSessionFactory() {
            return factory;
        }
    }
    ma continuo ad avere quell'errore.
    non dovrebbe bastare questo??

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da fermat Visualizza il messaggio
    non dovrebbe bastare questo??
    Se hai messo:

    blabla......./src/main/resources/mybatis-config.xml

    è corretto passare a getResourceAsReader una specifica "mybatis-config.xml". Perlomeno per quanto riguarda il concetto delle "risorse" rintracciate in classpath tramite un ClassLoader.

    Se stai usando un IDE e hai fatto lo spostamento da fuori del IDE, assicurati di rinfrescare il progetto (vale per Eclipse) e assicurati di ri-buildare bene il tutto.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    uso netbeans, ed ho fatto tutto dall'ide.
    nel momento in cui ho creato un nuovo folder dall'ide con nome resources, lo ha riconosciuto da solo.
    poi, sempre da ide, ho spostato il file la dentro.
    a questo punto ho fatto un bel clean & build, e poi lanciato il junit test.
    non ho modificato il pom.xml, in quanto ho letto che la directory resources la riconosce già da solo, in quanto è quella di default di mave.

    lanciando il junit test, mi sembra di non avere più quell'errore, ma ottengo cmq un failed nel test:
    codice:
    -------------------------------------------------------------------------------
    Test set: UtenteServiceTest
    -------------------------------------------------------------------------------
    Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.131 sec <<< FAILURE!
    testGetUtenti(UtenteServiceTest)  Time elapsed: 0.086 sec  <<< ERROR!
    java.lang.ExceptionInInitializerError
        at UtenteServiceTest.testGetUtenti(UtenteServiceTest.java:28)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
        at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
        at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
        at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
        at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
        at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
        at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
        at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
        at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
        at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
        at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
        at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
        at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
        at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
        at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
        at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:53)
        at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:123)
        at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:104)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:164)
        at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:110)
        at org.apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.java:175)
        at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcessWhenForked(SurefireStarter.java:107)
        at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:68)
    Caused by: org.apache.ibatis.exceptions.PersistenceException: 
    ### Error building SqlSession.
    ### The error may exist in SQL Mapper Configuration
    ### Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: java.io.IOException: Could not find resource jdbc.properties
        at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
        at org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:52)
        at org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:36)
        at com.mp.testmaven.MyBatisUtils.<clinit>(MyBatisUtils.java:21)
        ... 32 more
    Caused by: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: java.io.IOException: Could not find resource jdbc.properties
        at org.apache.ibatis.builder.xml.XMLConfigBuilder.parseConfiguration(XMLConfigBuilder.java:120)
        at org.apache.ibatis.builder.xml.XMLConfigBuilder.parse(XMLConfigBuilder.java:98)
        at org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:50)
        ... 34 more
    Caused by: java.io.IOException: Could not find resource jdbc.properties
        at org.apache.ibatis.io.Resources.getResourceAsStream(Resources.java:114)
        at org.apache.ibatis.io.Resources.getResourceAsStream(Resources.java:100)
        at org.apache.ibatis.io.Resources.getResourceAsProperties(Resources.java:128)
        at org.apache.ibatis.builder.xml.XMLConfigBuilder.propertiesElement(XMLConfigBuilder.java:224)
        at org.apache.ibatis.builder.xml.XMLConfigBuilder.parseConfiguration(XMLConfigBuilder.java:106)
        ... 36 more
    questo il file mybatis-config.xml:
    codice:
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
        <properties resource="jdbc.properties" />
        <typeAliases>
            <typeAlias type="com.mp.mappers.Utente" alias="Utente"></typeAlias>
        </typeAliases>
        <environments default="development">
            <environment id="development">
                <transactionManager type="JDBC" />
                <dataSource type="POOLED">    
                    <property name="driver" value="com.mysql.jdbc.Driver" />
                    <property name="url" value=".........." />
                    <property name="username" value="..." />
                    <property name="password" value="..." />
                </dataSource>
            </environment>
        </environments>
        <mappers>
            <mapper resource="com/mp/mappers/UtenteMapper.xml" />
        </mappers>
    </configuration>

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da fermat Visualizza il messaggio
    ### Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: java.io.IOException: Could not find resource jdbc.properties
    Quel <properties resource="jdbc.properties" />

    serve per leggere un file di "properties" (le regole sul principio delle risorse è lo stesso) al fine di esternalizzare delle configurazioni come user/password, ecc.. che non vorresti "cablare" nel mybatis-config.xml

    C'è la spiegazione sulla documentazione ufficiale:
    http://www.mybatis.org/mybatis-3/con...tml#properties
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    ah giusto, non ci avevo fatto caso in effetti.
    quella riga l'ho levata, ed ho anche spostato il UtenteMapper.xml nel resources folder.

    a questo punto ho lanciato il test così modificato:
    codice:
    public class UtenteServiceTest {
    
        private static UtenteService us;
    
        @BeforeClass
        public static void setUpClass() {
            us = new UtenteService();
        }
    
        @AfterClass
        public static void tearDownClass() {
            us = null;
        }
    
        @Test
        public void testGetUtenti() {
            List<Utente> utenti = us.getUtenti();
            Assert.assertNotNull(utenti);
            for (Utente u : utenti) {
                System.out.println(u.getEmail());
            }
        }
    
    }
    ma ottengo un altro errore (non se ne esce più ):
    codice:
    -------------------------------------------------------------------------------
    Test set: UtenteServiceTest
    -------------------------------------------------------------------------------
    Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.211 sec <<< FAILURE!
    testGetUtenti(UtenteServiceTest)  Time elapsed: 0.162 sec  <<< ERROR!
    org.apache.ibatis.exceptions.PersistenceException: 
    ### Error querying database.  Cause: java.sql.SQLException: No suitable driver found for URL_DB
    ### The error may exist in UtenteMapper.xml
    ### The error may involve com.mp.mappers.UtenteMapper.getUtenti
    ### The error occurred while executing a query
    ### Cause: java.sql.SQLException: No suitable driver found for http://ferrons.homepc.it:3306/test
        at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
        at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:150)
        at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:141)
        at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:137)
        at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:75)
    ......
    dentro maven ho messo questo però:
    codice:
    <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.6</version>
            </dependency>
    il db in verità è mariaDB, ma da quanto ho capito la compatibilità dovrebbe essere al 100% tra i due db (almeno per quanto riguarda la connessione).

    PS:
    ok risolto mettendo l'url della connessione così: jdbc:mysql://URL:3306/DB_NOME
    adesso funziona tutto.
    grazie mille per l'aiuto!!
    Ultima modifica di fermat; 18-12-2016 a 13:41

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,317
    Salto pagina.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da fermat Visualizza il messaggio
    codice:
    <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.6</version>
            </dependency>
    il db in verità è mariaDB, ma da quanto ho capito la compatibilità dovrebbe essere al 100% tra i due db (almeno per quanto riguarda la connessione).
    C'è il Connector/J specifico per MariaDB e l'artifact per Maven è chiaramente differente.

    Vedi: https://mariadb.com/kb/en/mariadb/ab...b-connector-j/
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  10. #10
    Quote Originariamente inviata da andbin Visualizza il messaggio
    C'è il Connector/J specifico per MariaDB e l'artifact per Maven è chiaramente differente.

    Vedi: https://mariadb.com/kb/en/mariadb/ab...b-connector-j/
    ciao andbin!
    ho usato il driver classico.
    il problema era nell'indirizzo del db.
    avevo omesso la porta nella url.
    ho sistemato e adesso funziona senza problemi.

    grazie!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.