检查 InjectionPoint getAnnotated 方法的行为更改

在 Contexts and Dependency Injection (CDI) 1.0 实现中,用于实现 javax.enterprise.inject.spi.InjectionPoint 接口的类上的 getAnnotated 方法可返回 javax.enterprise.inject.spi.Annotated 实例。在 CDI 1.2 实现中,getAnnotated 方法必须返回 AnnotatedFieldAnnotatedParameter 实例,这取决于注入点是构造函数/方法上所注入的字段还是参数。

此规则将标记用于实现 javax.enterprise.inject.spi.InjectionPoint 接口的类上 getAnnotated 方法中 Annotated 构造函数的调用。例如,将标记以下对 new Annotated() 的调用:


public class MyInjectionPoint implements InjectionPoint {

    public Annotated getAnnotated() {
        return new Annotated() {

            public Set<Annotation> getAnnotations() {
                return null;
            }
            ...
        };
    }
    ...
}

二进制应用程序扫描程序标记实现 javax.enterprise.inject.spi.InjectionPoint 接口的类上的所有 getAnnotated 方法。如果标记的 getAnnotated 方法返回 AnnotatedParameterAnnotatedField 的实例,那么可忽略此规则。如果 getAnnotated 方法返回 Annotated 的实例,那么必须更改代码。

在 CDI 1.2 实现中,包含类 MyInjectionPoint 的应用程序将无法启动,并且会抛出以下异常:

org.jboss.weld.exceptions.IllegalArgumentException: WELD-001521: InjectionPoint.getAnnotated() must return either AnnotatedParameter or AnnotatedField

要解决此问题,请将对 new Annotated() 的调用替换为 new AnnotatedField()new AnnotatedParameter(),这取决于注入点是构造函数/方法上所注入的字段还是参数。

有关 Java EE 7 CDI 1.2 实现的更多信息,请参阅 Contexts and Dependency Injection 1.2 行为更改