Можно ли применить созданные вручную аннотации Java к параметрам метода? - PullRequest
1 голос
/ 04 августа 2020

В следующих темах:

обсуждается, как создать экземпляр аннотации Java.

Мой вопрос: : имея такой экземпляр аннотации, какой я могу с этим поделать? В частности, можно как-то применить его к параметру метода?

Мотивация :

Готовлю несколько Azure Функции, и мне не нравится тот факт, что мне нужно много раз повторять код вроде

 @HttpTrigger(name = "req", methods = {HttpMethod.GET}, route= "/api/mypath", authLevel = AuthorizationLevel.ANONYMOUS)

Поэтому я подумал, что создам метод HttpTrigger createHttpTrigger(HttpMethod httpMethod) { ... }, а затем вместо

@FunctionName("MyFunction")
public HttpResponseMessage getModelNames(
   @HttpTrigger(name = "req", methods = {HttpMethod.GET}, route= "api/mypath", authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Optional<String>> request, 
   final ExecutionContext context) {
...
}

напишите что-нибудь вроде

@FunctionName("MyFunction")
public HttpResponseMessage getModelNames(
   @createHttpTrigger(HttpMethod.GET) HttpRequestMessage<Optional<String>> request, 
   final ExecutionContext context) {
}

(но, конечно, этот код неверен)

1 Ответ

1 голос
/ 19 августа 2020

Я просмотрел исходный код HttpTrigger и обнаружил, что мне просто нужно добавить некоторые значения по умолчанию в свойства аннотации.

package com.microsoft.azure.functions.annotation;

import com.microsoft.azure.functions.HttpMethod;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.PARAMETER})
public @interface HttpTrigger {
    String name();

    String dataType() default "";

    String route() default "";

    HttpMethod[] methods() default {};

    AuthorizationLevel authLevel() default AuthorizationLevel.FUNCTION;
}

Создайте новую аннотацию.

import com.microsoft.azure.functions.HttpMethod;
import com.microsoft.azure.functions.annotation.AuthorizationLevel;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.PARAMETER})
public @interface CreateHttpTrigger {
    String name() default "req";

    String dataType() default "";

    String route() default "/api/mypath";

    HttpMethod[] methods() default {};

    AuthorizationLevel authLevel() default AuthorizationLevel.ANONYMOUS;
}

Код можно переписать следующим образом.

    @FunctionName("HttpTrigger-Java")
    public HttpResponseMessage run(
            @CreateHttpTrigger(methods = {HttpMethod.GET}) HttpRequestMessage<Optional<String>> request,
            final ExecutionContext context) {

Но когда я запускаю его, появляется следующее сообщение об ошибке:

Функция 'HttpTrigger- Java' - в ошибке: должна быть объявлена ​​хотя бы одна привязка.

Я пробовал несколько методов, но ни один из них не помог успешно, поэтому я проверил официальную документацию по привязке и запуску.

введите описание изображения здесь

Из приведенной выше таблицы я делаю вывод, что пользовательская аннотация CreateHttpTrigger является привязкой, которая не поддерживается функцией Azure.

Таким образом, я полагаю, что ваша идея не может быть реализованным. Если у вас есть идеи получше, вы можете мне сказать. Готов продолжить обсуждение этого вопроса.

...