

JavaのSpring Frameworkをつかって、  
webアプリケーションを作成しています

しかし、複数のBeanを登録したいのですが、うまくいきません。

**・目標**  
複数のBeanを扱いたい

**・エラーメッセージ**  
Consider marking one of the beans as @Primary, updating the consumer to accept
multiple beans, or using @Qualifier to identify the bean that should be
consumed

**・自分でエラー解消のために実施したこと**  
@Qualifierの付与

**User.java**

[code]

    package com.example.demo.entity;
    
    import java.io.Serializable;
    import org.springframework.stereotype.Component;
    
    @Component("User")
    public class User implements Serializable{
        
        private static final long serialVersionUID = 1L;
        
        
        private int userId;
        private int pass;
        
        public int getUserId() {
            return userId;
        }
        public void setUserId(int userId) {
            this.userId = userId;
        }
        
        public int getPass() {
            return pass;
        }
        public void setPass(int pass) {
            this.pass = pass;
        }
    
    }
    
    
[/code]

**Info.java**

[code]

    package com.example.demo.entity;
    
    import java.io.Serializable;
    
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.stereotype.Component;
    
    @Component("Info")
    public class Info implements Serializable{
        
        private static final long serialVersionUID = 1L;
        
        private int examId;
        private String examName;
        private String examDate;
        
        public int getExamId() {
            return examId;
        }
    
    
        public void setExamId(int examId) {
            this.examId = examId;
        }
    
    
        public void setExamName(String examName) {
            this.examName = examName;
        }
    
        public void setExamDate(String examDate) {
            this.examDate = examDate;
        }
    
        public String getExamName() {
            return examName;
        }
    
        public String getExamDate() {
            return examDate;
        }
    
    }
    
    
[/code]

**ServiceUserImpl.java**

[code]

    package com.example.demo.service;
    
    import java.util.List;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.stereotype.Service;
    
    import com.example.demo.dao.UserDao;
    import com.example.demo.entity.Info;
    import com.example.demo.entity.User;
    
    @Service
    public class ServiceUserImpl implements TestService {
        
        @Autowired
        UserDao dao;
        
        @Autowired
        @Qualifier("User")
        User user;
        
    
        @Override
        public List selectWhere(Object t) {
            
            User u = (User)t;
            
            List<User> list = dao.selectWhere(u);
            
            return list;
            
        
        }
    }
    
[/code]

**ServiceExamInfoImpl.java**

[code]

    package com.example.demo.service;
    
    import java.util.List;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.stereotype.Service;
    
    import com.example.demo.dao.ExamInfoDao;
    import com.example.demo.entity.Info;
    
    @Service
    public class ServiceExamInfoImpl implements TestService {
        
        @Autowired
        ExamInfoDao dao;
        
        @Autowired
        @Qualifier("Info")
        Info info;
        
        
    
        @Override
        public List selectWhere(Object t) {
            
            Info info = (Info)t;
            
            List<Info> list = dao.selectWhere(info);
            
            return list;
            
        }
    
[/code]


CC BY-SA 4.0
2022-05-05T06:33:10.270
88655
2022-05-05T08:40:09.667
52489
question
java spring spring-boot
@Qualifierの使い方


質問文中のエラーメッセージが、どの bean
に対して出ているのかが重要です。質問文中のエラーメッセージが出力された直前に、何が問題になっているのかもまた出力されていると思いますので確認してみてください。

質問文中のコードで可能性があるとすると `TestService` を auto-wire
しようとした場合が考えられますが、この場合ですと、例えば次のように `@Qualifier` を付与すれば解消するでしょう。

[code]

    @RestController
    public class MyController {
    
        @Autowired
        @Qualifier("serviceUserImpl")
        private TestService testService;
    ...
    
[/code]

補足:

デフォルトの qualifier 値は bean name であり、また、デフォルトの bean name はクラス名の最初を小文字にしたものです。  
つまり、何も明示しなかった場合 `ServiceUserImpl` の qualifier 値は `serviceUserImpl` になります。

[1.9.4. Fine-tuning Annotation-based Autowiring with
Qualifiers](https://docs.spring.io/spring-
framework/docs/5.3.19/reference/html/core.html#beans-autowired-annotation-
qualifiers)

> For a fallback match, the bean name is considered a default qualifier value.

[1.10.6. Naming Autodetected Components](https://docs.spring.io/spring-
framework/docs/5.3.19/reference/html/core.html#beans-scanning-name-generator)

> If such an annotation contains no name `value` or for any other detected
> component (such as those discovered by custom filters), the default bean
> name generator returns the uncapitalized non-qualified class name.


CC BY-SA 4.0
2022-05-05T08:40:09.667
88656
2022-05-05T08:40:09.667
2808
88655
answer