2015-05-06 4 views
4

Вот трассировки стека, когда я пытаюсь выполнить простой запрос с использованием MyBatis:MyBatis Spring MVC Ошибка: недопустимый оценка утверждение (не найдено)

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.my.package.persistence.BrandMapper.getBrand 
    org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.java:189) 
    org.apache.ibatis.binding.MapperMethod.<init>(MapperMethod.java:43) 
    org.apache.ibatis.binding.MapperProxy.cachedMapperMethod(MapperProxy.java:58) 
    org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:51) 
    com.sun.proxy.$Proxy25.getBrand(Unknown Source) 
    com.my.package.service.BrandService.getBrand(BrandService.java:18) 
    com.my.package.service.BrandService$$FastClassBySpringCGLIB$$1140c60a.invoke(<generated>) 
    org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) 
    org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:649) 
    com.my.package.service.BrandService$$EnhancerBySpringCGLIB$$ea6f89cd.getBrand(<generated>) 
    com.my.package.controller.HomeController.getBrands(HomeController.java:28) 
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    java.lang.reflect.Method.invoke(Method.java:483) 
    org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221) 
    org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) 
    org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110) 
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:777) 
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:706) 
    org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) 
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:943) 
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877) 
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966) 
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:622) 
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 

Я использую Javaconfig синтаксис вместо конфигурации XML. Вот мой PersistenceConfig:

@Configuration 
@EnableTransactionManagement 
@MapperScan("com.my.package.persistence") 
public class PersistenceConfig { 

    @Bean 
    public DataSource dataSource() { 

     DriverManagerDataSource dataSource = new DriverManagerDataSource(); 

     try { 
      dataSource.setDriverClassName("com.mysql.jdbc.Driver"); 
      dataSource.setUrl("jdbc:mysql//localhost:3306/db"); 
      dataSource.setUsername("dbuser"); 
      dataSource.setPassword("dbpassword"); 
     } catch (Exception e) { 
      System.out.print(e); 
     } 
     return dataSource; 
    } 

    @Bean 
    public DataSourceTransactionManager transactionManager() { 
     return new DataSourceTransactionManager(dataSource()); 
    } 

    @Bean 
    public SqlSessionFactoryBean sqlSessionFactory() throws Exception { 
     SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); 
     sessionFactory.setDataSource(dataSource()); 
     sessionFactory.setTypeAliasesPackage("com.my.package.domain"); 
     return sessionFactory; 
    } 
} 

Вот мой контроллер:

@Controller 
public class HomeController { 

    private static Logger logger = LoggerFactory.getLogger(HomeController.class); 

    @Autowired 
    private BrandService brandService; 

    @RequestMapping(value = "/", method = RequestMethod.GET) 
    public String index() { 
     return "index"; 
    } 

    @RequestMapping(value = "/brands", method = RequestMethod.GET) 
    public String getBrands(Model model) { 
     model.addAttribute("brands",brandService.getBrand(1)); 
     return "brands"; 
    } 

} 

Вот мой Марка Mapper Интерфейс:

public interface BrandMapper { 

    Brand getBrand(int id); 

    Brand getBrandByName(String name); 

    List<Brand> getBrandList(); 

    void addBrand(Brand brand); 

    void updateBrand(Brand brand); 

    void deleteBrand(int id); 

} 

Вот мой BrandMapper XML:

<?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.my.package.persistence.BrandMapper"> 

    <select id="getBrand" resultType="Brand" parameterType="int"> 
     SELECT id, name 
     FROM brand 
     WHERE id = #{id}; 
    </select> 

    <select id="getBrandByName" resultType="Brand" parameterType="String"> 
     SELECT id, name 
     FROM brand 
     WHERE name = #{name}; 
    </select> 

    <select id="getBrandList" resultType="Brand"> 
     SELECT id, name 
     FROM brand; 
    </select> 

    <insert id="addBrand" parameterType="Brand"> 
     INSERT INTO brand (id, name) 
     VALUE (#{id}, #{name}) 
    </insert> 

    <update id="updateBrand" parameterType="Brand"> 
     UPDATE brand 
     SET 
     name = #{name} 
     where id = #{id} 
    </update> 

    <delete id="deleteBrand" parameterType="int"> 
     DELETE FROM brand 
     WHERE id = #{id} 
    </delete> 

</mapper> 

Я провел некоторое исследование, но ни одно из решений не сработало для меня. Мои файлы XML Mapper находятся под ресурсами в пакете с именем «com.my.package.persistence»

У кого-нибудь есть идея, что здесь не так?

Заранее спасибо

+0

Отличный пост, ясность помогла мне решить проблему самостоятельно. –

ответ

0

Я думаю, может быть, нужно @Alias ​​ аннотацию:

@Alias ​​("Brand") класс Марка { ... }

это первое, что приходит мне на ум, надеется, что это поможет!

0

Если вы использовали JUNIT кода службы db, это сработало бы. Поэтому я считаю, что это проблема, когда создается WAR-файл, из вашей конфигурации * Mapper.java и * Mapper.xml указывает на то же местоположение. Следовательно, когда война является gerenated, путь к папке как для java, так и для xml-файлов будет WEB-INF/classes/com/my/package/persistence. Однако * .xml-файл не копируется в местоположение. Один из способов - сконфигурировать скрипт сборки для копирования файлов xml или другого (что я бы предпочел) для создания каталога sqlmap в каталоге ресурсов и копирования всех файлов xml-mapper в каталог и указания местоположения mapperfile с помощью sessionFactory.setMapperLocations и после войны файл генерируется убедитесь, что каталог sqlmap присутствует в WEB-INF/classes каталоге

0

Удалить ; из запроса:

<select id="getBrand" resultType="Brand" parameterType="int"> 
    SELECT id, name 
    FROM brand 
    WHERE id = #{id} 
</select> 
4

Try проверки mybatis-conf.xml (независимо от имени вашей называется этот файл) файл и посмотреть, если у вас есть ваш XML-калькулятор:


<mappers> 
    <mapper resource="BrandMapper.xml"> 
<mappers> 
0

Сообщение об ошибке:

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): 

Скорее всего, из-за неправильного картографа Синтаксис запросов. У меня была эта проблема много раз и каждый раз, когда ошибка вызвана неправильным синтаксисом запроса, написанного в файлах Mapper xml и интерфейсе.Я предлагаю вам,

  • Проверьте правильность вашего запроса, что является основной причиной этой ошибки.
  • Конфигурация => Может также возникнуть из-за неверной конфигурации файлов карт (интерфейс & xml) в файлах конфигурации.
  • ли установить Maven чистый, Maven (восстановить), а затем перезапустить сервер
0

Вы должны предоставить места картографа при инициализации sqlSessionFactory:

@Autowired 
    private ResourceLoader resourceLoader; 

    @Bean 
    public SqlSessionFactoryBean sqlSessionFactory() throws Exception { 
     SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); 
     sessionFactory.setDataSource(dataSource()); 
     //sessionFactory.setTypeAliasesPackage("com.my.package.domain"); 
     sessionFactory.setMapperLocations(ResourcePatternUtils.getResourcePatternResolver(resourceLoader). 
      getResources("classpath:path/to/mappers/*.xml")); 
     return sessionFactory; 
    } 

В вашем случае замените «Путь к классам: путь/к/картостроителям/* XML» с :. классами. ком/моим/пакет/сохранение/* XML

Надеется, что это поможет.

0

У меня было это точное сообщение об ошибке, оказалось, что это путь пространства имен в XML-файле mapper, я изменил имя пакета в файле интерфейса java, но забыл обновить имя пакета в maper xml, бит нечетный. Обновлено пространство имен пакетов и hey presto!

0

Ваш файл карты должен находиться в том же пакете, что и файл * Repo.java. Также проверьте пространство имен mapper.

 Смежные вопросы

  • Нет связанных вопросов^_^