这是我的班级,
public class MyBusinessException extends RuntimeException {
@Autowired
private MessageSource messageSource;
private String errorCode;
private String messageInEnglish;
public MyBusinessException(String errorCode){
this.errorCode=errorCode;
this.messageInEnglish=messageSource.getMessage(this.code,null, Locale.ENGLISH);
}
}
这是一个异常类。当我将errorCode
作为参数传递给构造函数时,它应该填充错误消息,这就是我正在寻找的。实际上我想实例化这样的类
throw new MyBusinessException("MY-ERROR-CODE");//want to initiate like this(only one argument for constructor)
如何实现这样的目标?
到目前为止我所做的所有这些:
@PostConstruct
答案 0 :(得分:4)
抛出新的MyBusinessException(" MY-ERROR-CODE"); //想要启动 这(构造函数只有一个参数)
您不能将@Autowired
与不是由Spring创建的对象一起使用
我认为您应该重构代码以向MyBusinessException构造函数提供所有需要的信息
你不需要将它与Spring结合。
依赖于Spring的逻辑:
@Autowired
private MessageSource messageSource;
...
messageSource.getMessage(this.code,null, Locale.ENGLISH);
可以移动到Spring bean,它将创建一个完全初始化的MyBusinessException
实例
此外,其他例外可能需要messageSource.getMessage(this.code,null, Locale.ENGLISH)
。在特定的类中移动它这个逻辑是有道理的。
@Bean
public class ExceptionFactory{
@Autowired
private MessageSource messageSource;
public MyBusinessException createMyBusinessException(String errorCode){
return new MyBusinessException(errorCode, messageSource.getMessage(this.code,null, Locale.ENGLISH));
}
}
您可以注意到createMyBusinessException()
为客户提供了一个简单的API:他们只需传递错误代码String
即可创建例外。
MessageSource
依赖项是一个他们不需要打扰的实现细节。
例如,这就足够了:
throw exceptionFactory.createMyBusinessException("MY-ERROR-CODE");
答案 1 :(得分:2)
依赖注入仅适用于Spring创建的实例。
由于您手动初始化异常,因此需要将MessageSource
注入@Component
抛出此异常。
然后,您可以将MessageSource
传递给MyBusinessException
的构造函数,或者使用所需语言获取消息,并将此消息传递给构造函数。
@Component
public class MyComponentDoingBusinessLogic {
private MessageSource messageSource;
@Autowired
public MyComponentDoingBusinessLogic(MessageSource messageSource) {
this.messageSource = messageSource;
}
public void someBusinessLogic() {
//Doing something
if (errorState) {
throw new MyBusinessException(yourErrorCode, messageSource);
}
}
}
答案 2 :(得分:0)
你不能在ctor中使用@Autowired
,因为它还没有被Spring初始化。
正确的方法是实现InitializingBean
,这基本上是Spring的ctor,并且(afterPropertiesSet
方法)可以使用注入的字段。
答案 3 :(得分:0)
你不能这样做。抛出时会构造一个异常,这意味着它不会被Spring初始化。你可以做的是使用静态方法来获取当前的Spring应用程序上下文,并从那里获取你的bean。
这是否是一个干净的解决方案是另一个问题,但你没有问过这个问题。