4

This is the person who asked the question just before.

The error on the question was successful, but I was faced with another error.

As a beginner in Spring, there are many things I don't know and

I have a lot of questions to ask. Please understand.

The error code.

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'memberService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private dao.IMemberDAO service.MemberService.memberDao; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [dao.IMemberDAO] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
Related cause: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'memberDao' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Cannot resolve reference to bean 'sqlSessionFactory' while setting bean property 'sqlSessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactory' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is org.springframework.core.NestedIOException: Failed to parse mapping resource: 'file [C:\Users\admin\eclipse-workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\rachelivf\WEB-INF\classes\dao\mapper\memberDaoMapper.xml]'; nested exception is org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML. Cause: org.apache.ibatis.builder.BuilderException: Error resolving class. Cause: org.apache.ibatis.type.TypeException: Could not resolve type alias 'member'.  Cause: java.lang.ClassNotFoundException: Cannot find class: member
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1210)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)

The following is the MemberService.java code.

package service;

import java.util.HashMap;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;


import dao.IMemberDAO;
import model.Member;

@Service
public class MemberService  
{
    @Autowired
    private IMemberDAO memberDao;

    public void joinMember(HashMap<String, Object> params)
    {
        if(params.get("pw").equals(params.get("pwd_CHECK")))
        {
            memberDao.insertMember(params);
        }
    }
}

Here is the applicationContext.xml code.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:jdbc="http://www.springframework.org/schema/jdbc"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.3.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">

    <context:component-scan base-package="service" />

    <bean class="org.springframework.jdbc.datasource.DriverManagerDataSource" id="dataSource">
        <property value="com.mysql.jdbc.Driver" name="driverClassName"></property>
        <property value="jdbc:mysql://localhost/rachelvf" name="url"></property>
        <property value="root" name="username"/>
        <property value="mysql" name="password"/>
    </bean>

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"></property>
        <property name="mapperLocations" value="classpath*:dao/mapper/*.xml"></property>
    </bean>

    <bean id="memberDao" class="org.mybatis.spring.mapper.MapperFactoryBean">
        <property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
        <property name="mapperInterface" value="dao.IMemberDAO"></property>
    </bean>

</beans>

As far as I know,

this is the reason why the above error occurs because

I didn't insert the annotation service.

But obviously I inserted the Service annotation, but I get an error.

Please give me advice.

It is memberDaoMapper code.

<?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="dao.IMemberDAO">
    <insert id="insertMember" parameterType="java.util.HashMap">
        insert into member values
        (
            #{id},#{pw},default     
        )
    </insert>

    <update id="updateMember" parameterType="java.util.HashMap">
        update member set id = #{id}, pw = #{pw}, authority = #{authority}
    </update>

    <delete id="deleteMember" parameterType="String">
        delete from member where id = #{id}
    </delete>

    <select id="selectOne" parameterType="String" resultType="member">
        select * from member where id = #{id}
    </select>

    <select id="selectAll" parameterType="String" resultType="member">
        select * from member
    </select>
</mapper>

It is IMemberDao.java code.

package dao;

import java.util.HashMap;

import java.util.List;

import org.mybatis.spring.annotation.MapperScan;

import model.Member;

public interface IMemberDAO 
{
    public int insertMember(HashMap<String, Object> params);

    public int updateMember(HashMap<String, Object> params);

    public int deleteMember(String id);

    public HashMap<String, Object> selectOne(String id);

    public List<HashMap<String, Object>> selectAll();
}

I checked the typo thoroughly, but there was no typo to be found.

What's the problem?

Seongwon-Choi
  • 459
  • 8
  • 24

1 Answers1

1

This part of the stacktrace should give you a proper hint of the issue:

org.apache.ibatis.type.TypeException: Could not resolve type alias 'member'

Without the mapper files, I suppose that there is an error in one of them and probably you wrote member in an XML attribute that requires a fully qualified class name.

My suggestion is to search member in those file and you should find it in an incorrect field (mostly like parameterType or resultType)

Looking at the Mapping file that you added, you have resultType="member". As stated above resultType requires a fully qualified class name. The solutions to your issue are mostly 2:

  1. Modify the resultType to the actual class

    <select id="selectOne" parameterType="String" resultType="model.Member">
        select * from member where id = #{id}
    </select>
    
    <select id="selectAll" parameterType="String" resultType="model.Member">
        select * from member
    </select>
    
  2. Add type alias tag for sampleVO class.

    <mapper namespace="model.Member">
         <typeAlias alias="member" type="model.Member" />
        ...
    </mapper>
    
araknoid
  • 3,065
  • 5
  • 33
  • 35
  • 1
    I did not specify the parameter in selectAll in the DAO part, but the error occurred because the mapper specified parameter type to selectAll. I solved the problem because of your advice. It is work very well!.. But there is one question. Should mapper and Dao match 1:1? – Seongwon-Choi Aug 02 '17 at 15:44
  • It really depends on how you want to structure your project but having the queries of each DAO in a separate file could be helpfull in term on maintainability if the project grows. – araknoid Aug 02 '17 at 15:47
  • 1
    I know new information, thank you. But what I want to know is that the parameterType specified in the mapper and the parameterType specified in Dao must be the same. – Seongwon-Choi Aug 02 '17 at 15:50