gpt4 book ai didi

java - Spring 4 - 对象不会 Autowiring 变量

转载 作者:行者123 更新时间:2023-11-30 03:26:48 25 4
gpt4 key购买 nike

我有我的 junit 测试类(class):

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { AppConfig.class })
@WebAppConfiguration
public class TelephoneNumberTest {

@Autowired //Test that bean exists in application context
private void setPhoneNumberValidator(PhoneNumberValidator phoneNumberValidator){
this.phoneNumberValidator = phoneNumberValidator;
}

@Test
public void autoWireValidatorTest(){
assertNotNull(phoneNumberValidator); //Test passes

}

@Test
public void validUSNumber(){
PhoneNumber phoneNumber = null;
ContactType expectedContactType = ContactType.PRIMARY;
Country expectedCountry = Country.UNITED_STATES;
String expectedAreaCode = "940";
String expectedExchangeCode = "368";
String expectedLocalNumber = "7410";

try {
phoneNumber = new TelephoneNumber(expectedContactType, expectedCountry, expectedAreaCode,
expectedExchangeCode, expectedLocalNumber);
} catch (InvalidPhoneNumberException e) {
fail(e.getMessage());
}

assertNotNull(phoneNumber);
assertThat(phoneNumber.getContactType(), is(expectedContactType));
assertThat(phoneNumber.getCountry(), is(expectedCountry));
assertThat(phoneNumber.getAreaCode(), is(expectedAreaCode));
assertThat(phoneNumber.getExchangeCode(), is(expectedExchangeCode));
assertThat(phoneNumber.getLocalNumber(), is(expectedLocalNumber));
}
}

我的应用配置

@Configuration
@EnableWebMvc
@ComponentScan("software.userprofile")
public class AppConfig {}

我的 PhoneNumber 对象

package software.userprofile.models;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import software.userprofile.models.exceptions.InvalidPhoneNumberException;
import software.userprofile.models.validators.*;

import java.util.Comparator;

public class TelephoneNumber implements PhoneNumber{
private ContactType contactType;
private Country country;
private String areaCode;
private String exchangeCode;
private String localNumber;
private PhoneNumberValidator phoneNumberValidator;

public TelephoneNumber() {}

public TelephoneNumber(ContactType contactType, Country country, String areaCode, String exchangeCode, String localNumber) throws InvalidPhoneNumberException {
this.contactType = contactType;
this.country = country;
this.areaCode = areaCode;
this.exchangeCode = exchangeCode;
this.localNumber = localNumber;
validate();
}

public ContactType getType() {
return contactType;
}

public Country getCountry() {
return country;
}

public String getAreaCode() {
return areaCode;
}

public String getExchangeCode(){return exchangeCode;}

public String getLocalNumber() {
return localNumber;
}

public PhoneNumberValidator getPhoneNumberValidator(){
return phoneNumberValidator;
}

@Autowired
private void setPhoneNumberValidator(PhoneNumberValidator phoneNumberValidator){
this.phoneNumberValidator = phoneNumberValidator;
}

public void validate() throws InvalidPhoneNumberException {
phoneNumberValidator.doValidation(country, this);
}

@Override
public String toString() {
return "TelephoneNumber{" +
"contactType=" + contactType +
", country='" + country + '\'' +
", areaCode='" + areaCode + '\'' +
", exchangeCode='" + exchangeCode + '\'' +
", localNumber='" + localNumber + '\'' +
'}';
}

public static Comparator<TelephoneNumber> COMPARE_BY_TYPE = new Comparator<TelephoneNumber>() {
public int compare(TelephoneNumber one, TelephoneNumber other) {
return one.getType().compareTo(other.getType());
}
};
}

最后是我的 PhoneNumberValidator 类

package software.userprofile.models.validators;

import org.springframework.stereotype.Component;
import software.userprofile.models.Country;
import software.userprofile.models.PhoneNumber;
import software.userprofile.models.exceptions.InvalidPhoneNumberException;

import java.util.*;

@Component
public class PhoneNumberValidator {
private Map<Country, PhoneNumberCountryValidator> phoneNumberValidators = new HashMap<Country, PhoneNumberCountryValidator>();
private Country defaultCountry;

public PhoneNumberValidator(){
init();
}

private void init(){
phoneNumberValidators.put(Country.UNITED_STATES, new USPhoneNumberCountryValidator());
phoneNumberValidators.put(Country.UNITED_KINGDOM, new UKPhoneNumberValidator());
phoneNumberValidators.put(Country.MEXICO, new MexicoPhoneNumberCountryValidator());
phoneNumberValidators.put(Country.CANADA, new CanadaPhoneNumberValidator());
}

public void doValidation(Country country, PhoneNumber phoneNumber) throws InvalidPhoneNumberException {
if(country == null){throw new InvalidPhoneNumberException("Country code is null");}
phoneNumberValidators.get(country).validate(phoneNumber);

}

public void setPhoneNumberValidators(Map<Country, PhoneNumberCountryValidator> phoneNumberValidators) {
this.phoneNumberValidators = phoneNumberValidators;
}

}

我的问题:TelephoneNumberClass 中的 PhoneNumberValidator 对象不是 Autowiring 的,当我运行测试时,我在 PhoneNumberValidator 的 doValidation() 实例中遇到空指针异常。我唯一能想到的是 Spring 无法识别 TelephoneNumber 类,但我不知道如何解决这个问题。

我查看了该网站上的几篇帖子,但没有任何效果。

有什么想法吗?

最佳答案

TelephoneNumber不是由spring管理的,你需要通知spring将其作为bean进行管理。例如

@Component
public class TelephoneNumber implements PhoneNumber {...}

关于java - Spring 4 - 对象不会 Autowiring 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30002823/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com