Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使@Resource成为可选的?_Java_Spring_Jakarta Ee - Fatal编程技术网

Java 如何使@Resource成为可选的?

Java 如何使@Resource成为可选的?,java,spring,jakarta-ee,Java,Spring,Jakarta Ee,有没有办法让@Resource成为可选的?这意味着如果我没有@Resource请求的类型的bean,我将不会得到异常,但它将被设置为null。ok看起来不可能。必须使用@Autowired(必需=false)。这不是我想要的,但它可以做到。您应该能够使用自定义factory bean来实现这一点: public class OptionalFactoryBean<T> implements BeanFactoryAware, FactoryBean<T> { p

有没有办法让@Resource成为可选的?这意味着如果我没有@Resource请求的类型的bean,我将不会得到异常,但它将被设置为null。

ok看起来不可能。必须使用@Autowired(必需=false)。这不是我想要的,但它可以做到。

您应该能够使用自定义factory bean来实现这一点:

public class OptionalFactoryBean<T> implements BeanFactoryAware, FactoryBean<T> {

    private String beanName;

    public void setBeanName(String beanName) {
         this.beanName = beanName;
    }

    @Override
    public T getObject() throws Exception {
        T result;
        try {
            result = beanFactory.getBean(beanName);
        } catch (NoSuchBeanDefinitionException ex) {
            result = null;
        }
        return result;
    }

    private BeanFactory beanFactory;

    @Override
    public void setBeanFactory(BeanFactory beanFactory) {
        this.beanFactory = beanFactory;
    }

    private Class<?> objectType = Object.class;

    public void setObjectType(Class<?> objectType) {
        this.objectType = objectType != null? objectType : Object.class;
    }

    @Override
    public Class<?> getObjectType() {
        return objectType;
    }

    @Override
    public boolean isSingleton() {
         return true;
    }    
}

如果您想注入一些特定的bean。

您可以在资源类型上使用
@Value
和默认值(
{null}

@Value("some-data.txt:#{null}") Resource resource
如果文件some-data.txt不存在,则属性不会设置为
null
,而是具有不存在文件的资源。您可以调用
resource.exists()
而不是
resource!=空

public ResourceExample(@Value("some-data.txt:#{null}") Resource resource) {
    if (resource.exists()) {
        something(resource.getFile());
    }
}

看这里可能对你有帮助好吧看起来不可能。必须使用@Autowired(必需=false)。这不是我想要的,但它会让资源成为可选的,所以这就是你想要做的,即使你不知道:)Autowired和resource是两个不同的东西,试着用Autowired进行注入-它只对bean有效,而对resources@DanubianSailor-
@Autowired
是Spring注释,而
@Resource
是一种常见的Java注释。如果您没有使用Spring,那么
@Autowired
甚至都不是一个选项。
@Value("some-data.txt:#{null}") Resource resource
public ResourceExample(@Value("some-data.txt:#{null}") Resource resource) {
    if (resource.exists()) {
        something(resource.getFile());
    }
}