2015-10-14 2 views
1

Я испытываю некоторые проблемы с передачей конструктора-arg в свой проект с помощью Spring. Я уверен, что это нечто тривиальное, но я все еще пытаюсь узнать Весну. У меня есть код здесь:Проблема, связанная с конструктором-arg весной

package com.WheelOfFortune.Client; 

import java.util.ArrayList; 

import org.springframework.beans.factory.BeanFactory; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.beans.factory.xml.XmlBeanFactory; 
import org.springframework.core.io.FileSystemResource; 
import org.springframework.stereotype.Controller; 



@Controller 
public class Spinner implements SpinnerInterface{ 

    private int balance; 
    private String vacation; 
    private String car; 
    private ArrayList<String> spinWheel; 

    //Methods can access same instance of factory 
    BeanFactory factory = new XmlBeanFactory(new FileSystemResource(
      "src/main/resources/spring/SpinWheel.xml")); 

    public Spinner(){} 

    @Autowired 
    public Spinner(int balance, String vacation, String car, ArrayList<String> spinWheel) 
    { 
     this.balance = balance; 
     this.vacation = vacation; 
     this.car = car; 
     this.spinWheel = spinWheel; 
    } 

    //Setters and Getters 
    public void setSpinWheel() 
    { 
     this.spinWheel = spinWheel; 
    } 
    public ArrayList<String> getSpinWheel(ArrayList<String> getSpinWheel) 
    { 
     return spinWheel; 
    } 
    public void setBalance() 
    { 
     this.balance = balance; 
    } 
    public void setVacation() 
    { 
     this.vacation = vacation; 
    } 
    public void setCar() 
    { 
     this.car = car; 
    } 
    public int getBalance(int balance) 
    { 
     return balance; 
    } 
    public String getVacation(String vacation) 
    { 
     return vacation; 
    } 
    public String getCar(String car) 
    { 
     return car; 
    } 

    public void spin() { 
     Spinner spin = (Spinner) factory.getBean("spinWheel"); 

    } 

    public void addToBank(boolean isCorrect) { 
     // TODO Auto-generated method stub 

    } 

    public void deductFromBank() { 
     // TODO Auto-generated method stub 

    } 

    public void vacation(boolean isCorrect) { 
     Spinner vacation = (Spinner) factory.getBean("vacation"); 
     System.out.println(vacation); 
    } 
    public void car(boolean isCorrect){ 
     Spinner car = (Spinner) factory.getBean("car"); 
    } 
} 

И мой XML файл:

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

    <bean id="balance" class="com.WheelOfFortune.Client.Spinner"> 
     <constructor-arg> 
      <value>0</value> 
     </constructor-arg> 
    </bean> 

    <bean id="vacation" class="com.WheelOfFortune.Client.Spinner"> 
     <constructor-arg value="You Won a Trip to Hawaii!!" /> 
    </bean> 

    <bean id="car" class="com.WheelOfFortune.Client.Spinner"> 
     <constructor-arg value="You Won a brand new Corvette!!" /> 
    </bean> 

    <bean id="spinWheel" class="com.WheelOfFortune.Client.Spinner"> 
     <property name="word"> 
      <list> 
       <value>$100</value> 
       <value>$150</value> 
       <value>$275</value> 
       <value>$400</value> 
       <value>$500</value> 
       <value>$750</value> 
       <value>$1000</value> 
       <value>Bankruptcy</value> 
       <value>$5000</value> 
       <value>Vacation</value> 
       <value>Car</value> 
      </list> 
     </property> 
    </bean> 
</beans> 

Всякий раз, когда я пытаюсь запустить проект, я всегда получаю это для StackTrace:

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'vacation' defined in file [/home/ryan/workspace/wheel/src/main/resources/spring/SpinWheel.xml]: Could not resolve matching constructor (hint: specify index/type/name arguments for simple parameters to avoid type ambiguities) 
    at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:250) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1003) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:907) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:485) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190) 
    at com.WheelOfFortune.Client.Spinner.vacation(Spinner.java:74) 
    at com.WheelOfFortune.Client.Client.main(Client.java:10) 

У меня есть поместился вверх и вниз по XML-файлу и не мог найти причин, по которым он создавал бы эту стек. Какие-либо предложения?

+0

Ваш xml ожидает один конструктор аргументов, однако этого не найти в вашем классе. У вас есть конструктор no-args по умолчанию и один с 4 элементами. –

+0

Итак, мне нужно добавить в свой XML-документ, чтобы ожидать конструктор 4 аргументов. Правильно ли это? – ryekayo

+1

Как еще Spring мог бы создать экземпляр объекта, если вы не скажете ему, какой конструктор использовать. Кроме того, ваш код испорчен, никогда не создавайте новый экземпляр «BeanFactory» для получения bean-компонентов, все дело в использовании инъекции зависимостей, не говоря уже о том, работает ли этот код, вы получите бесконечный цикл создания экземпляров BeanFactory. –

ответ

1

В вашей конфигурации есть несколько неправильных вещей.

Во-первых, относительно вашего constructor-arg вопроса, вы используете один конструктор ARG в XML:

<bean id="balance" class="com.WheelOfFortune.Client.Spinner"> 
    <constructor-arg> 
     <value>0</value> 
    </constructor-arg> 
</bean> 

Но ваш Java только определить этот конструктор с 4 аргументах:

public Spinner(int balance, String vacation, String car, ArrayList<String> spinWheel); 

Что вы могли бы написать is:

<bean id="spinner" class="com.WheelOfFortune.Client.Spinner"> 
    <constructor-arg> 
     <value>0</value> 
    </constructor-arg> 
    <constructor-arg ref="vacation"> 
    ... 
</bean> 

Но прежде чем вам нужно исправить свой vacation bean (и то же для car и spinWheel). Вы набрали его как com.WheelOfFortune.Client.Spinner, но это String.

В конце концов вы смешиваете аннотации и конфигурацию XML. Это не проблема, но при запуске Spring это может сбивать с толку, я бы рекомендовал либо сделать все это в XML, либо в аннотациях.

Если вам нужно больше информации, не стесняйтесь спрашивать;)


EDIT: перечитывая свой пост, я на самом деле понимаю, что вы хотите написать, и только исправление типов ваших бобов может достаточно, если вы активируете сканирование компонентов.

+0

Спасибо за информацию об этом. Имеет смысл, что это не сработало. – ryekayo

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