какова цель аннотации @Nonbinding в квалификаторе, который должен быть в Java EE7?

Я читаю CDI инъекции в JavaEE 7, в частности, использую @Qualifier и @Produces для инъекции custom Data type в компонент.

У меня есть следующий код, взятый из документации JBoss ближе к концам страницы.

@Qualifier
@Retention(RUNTIME)
@Target({TYPE, METHOD, FIELD, PARAMETER})
public @interface HttpParam {
   @Nonbinding public String value();
}

import javax.enterprise.inject.Produces;
import javax.enterprise.inject.spi.InjectionPoint;

class HttpParams {
   @Produces @HttpParam("") 
   String getParamValue(InjectionPoint ip) {
      ServletRequest request = (ServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
      return request.getParameter(ip.getAnnotated().getAnnotation(HttpParam.class).value());
   }
}

И этот квалификатор можно использовать следующим образом:

@HttpParam("username") @Inject String username;
@HttpParam("password") @Inject String password;

У меня вопрос:

  1. что означает аннотация @Nonbinding? а зачем это нужно?

  2. Если подпись метода всегда должна быть такой @Nonbindng public String value();. Я спрашиваю об этом потому, что видел несколько разных примеров, но все они имеют одинаковую подпись. Это разрешено:

public @interface HttpParam {
       @Nonbinding public int value();
    }
  1. Могу ли я иметь более одного метода, определенного в интерфейсе. То есть разрешено следующее или нет?
 public @interface HttpParam {
       @Nonbinding public String value();
       @Nonbinding public int value1();
    } 

Спасибо


person brain storm    schedule 08.10.2014    source источник


Ответы (1)


  1. По умолчанию аргументы квалификатора учитываются для сопоставления квалификаторов bean-компонентов с квалификаторами точки внедрения. Аргумент @Nonbinding не учитывается для сопоставления.

  2. В этом случае компонент, созданный методом производителя, имеет квалификатор @HttpParam(""). Если бы аргумент был привязанным (т.е. не @Nonbinding), @HttpParam("") не соответствовал бы @HttpParam("username") в точке инъекции.

  3. Вы можете иметь любое количество аргументов-квалификаторов, обязательных или необязательных.

См. Типизированное разрешение в спецификации CDI.

person Harald Wellmann    schedule 08.10.2014
comment
Можно ли привести пример с привязкой и без привязки и показать, чем она отличается. Это будет очень полезно, пожалуйста - person brain storm; 09.10.2014
comment
Я испытал точное поведение, описанное вами во втором объяснении, при попытке использовать привязку перехватчика с параметризованными аннотациями. Я отчаянно пытался найти решение. Ты спас мне день. Большое спасибо. - person TMtech; 22.06.2018