是否可以对方法参数应用手动实例化的Java注释?
在以下主题中:是否可以对方法参数应用手动实例化的Java注释?,java,azure-functions,java-annotations,Java,Azure Functions,Java Annotations,在以下主题中: 讨论了如何创建Java注释的实例 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.RetentionPoli
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;
}
我的问题是:有这样一个注释实例,我能用它做什么?特别是,我可以在方法的参数上应用它吗
动机:
我正在准备几个Azure函数,我不喜欢这样的事实,我需要像代码一样重复很多次
所以我想我应该创建一个方法HttpTrigger createHttpTrigger(HttpMethod-HttpMethod){…}
,然后代替
@FunctionName(“MyFunction”)
公共HttpResponseMessageGetModelNames(
@HttpTrigger(name=“req”,methods={HttpMethod.GET},route=“api/mypath”,authLevel=AuthorizationLevel.ANONYMOUS)HttpRequestMessage请求,
最终执行(上下文){
...
}
写一些像
@FunctionName(“MyFunction”)
公共HttpResponseMessageGetModelNames(
@createHttpTrigger(HttpMethod.GET)HttpRequestMessage请求,
最终执行(上下文){
}
(当然,这段代码是不正确的)我查看了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;
}
创建新注释
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) {
@FunctionName(“HttpTrigger Java”)
公共HttpResponseMessage运行(
@CreateHttpTrigger(methods={HttpMethod.GET})HttpRequestMessage请求,
最终执行(上下文){
但当我运行它时,它会显示以下错误消息:
“HttpTrigger Java”函数出错:必须至少声明一个绑定
我尝试了几种方法,但都没有成功运行,所以我检查了官方的绑定和触发
从上表中,我推断自定义CreateHttpTrigger
注释是Azure函数不支持的绑定
总之,我想你的想法无法实现。如果你有更好的想法,你可以告诉我。我愿意继续讨论这个问题。如果你正在编写自定义注释,那么你可以使用反射api扫描并相应地修改你的api/实现。我能够实现一些我有某种需求的用例。这可以帮助