참고 : 이것은 일반적인 문제에 대한 정식 답변입니다.
필드 ( ) 가있는 Spring @Service
클래스 ( MileageFeeCalculator
)가 있지만 필드는 사용하려고합니다. 로그는 Bean과 Bean이 모두 생성되고 있음을 보여 주지만 서비스 Bean 에서 메소드 를 호출하려고 할 때마다 메시지가 표시 됩니다. Spring이 필드를 자동 배선하지 않는 이유는 무엇입니까?@Autowired
rateService
null
MileageFeeCalculator
MileageRateService
NullPointerException
mileageCharge
컨트롤러 클래스 :
@Controller
public class MileageFeeController {
@RequestMapping("/mileage/{miles}")
@ResponseBody
public float mileageFee(@PathVariable int miles) {
MileageFeeCalculator calc = new MileageFeeCalculator();
return calc.mileageCharge(miles);
}
}
서비스 클래스 :
@Service
public class MileageFeeCalculator {
@Autowired
private MileageRateService rateService; // <--- should be autowired, is null
public float mileageCharge(final int miles) {
return (miles * rateService.ratePerMile()); // <--- throws NPE
}
}
자동 연결되어야 MileageFeeCalculator
하지만 그렇지 않은 서비스 Bean :
@Service
public class MileageRateService {
public float ratePerMile() {
return 0.565f;
}
}
시도 할 GET /mileage/3
때이 예외가 발생합니다.
java.lang.NullPointerException: null
at com.chrylis.example.spring_autowired_npe.MileageFeeCalculator.mileageCharge(MileageFeeCalculator.java:13)
at com.chrylis.example.spring_autowired_npe.MileageFeeController.mileageFee(MileageFeeController.java:14)
...
F
이 다른 bean의 생성자 내에서 호출 될 수 있습니다S
. 이 경우 필요한 BeanF
을 다른 BeanS
생성자에 매개 변수로 전달하고S
with 의 생성자에 주석을 답니다@Autowire
. 첫 번째 빈의 클래스에 주석을 기억F
과를@Component
.