3

I am trying to create 2 Azure Functions with Spring Cloud but I can't make it work.

@Configuration
public class FirstFunction extends AzureSpringBootRequestHandler<Optional<Void>, String>
{
  @FunctionName("firstFunction")
  public void run(
      @HttpTrigger(name = "req", methods = {HttpMethod.POST}, authLevel = AuthorizationLevel.FUNCTION) HttpRequestMessage<Optional<String>> request,
      final ExecutionContext context)
  {
    handleRequest(Optional.empty(), context);
  }

  @Bean
  @Lazy
  Function<Optional<Void>, String> firstFunction()
  {
    return context ->
    {
      // do firstFunction stuff;
    };
  }
}



@Configuration
public class SecondFunction extends AzureSpringBootRequestHandler<Optional<Void>, String>
{
  @FunctionName("secondFunction")
  public void run(
      @HttpTrigger(name = "req", methods = {HttpMethod.POST}, authLevel = AuthorizationLevel.FUNCTION) HttpRequestMessage<Optional<String>> request,
      final ExecutionContext context)
  {
    handleRequest(Optional.empty(), context);
  }

  @Bean
  @Lazy
  Function<Optional<Void>, String> secondFunction()
  {
    return context ->
    {
      // do secondFunction stuff;
    };
  }
}



@SpringBootApplication
public class Application
{
  public static void main(final String[] args)
  {
    SpringApplication.run(Application.class, args);
  }
}

Using the above code with the dependency on spring-cloud-function-dependencies 2.0.1.RELEASE, it always hits the firstFunction Bean when calling both the firstFunction and secondFunction endpoints.

After doing some googling, I found this SO answer that suggests to move to 2.1.

However when I tried changing to 2.1.1.RELEASE, I am getting an exception where it is failing to find a main class:

System.Private.CoreLib: Exception while executing function: Functions.extractContent. System.Private.CoreLib: Result: Failure
Exception: IllegalArgumentException: Failed to locate main class
Stack: java.lang.IllegalStateException: Failed to discover main class. An attempt was made to discover main class as 'MAIN_CLASS' environment variable, system property as well as entry
in META-INF/MANIFEST.MF (in that order).

Need some help on what I am doing wrong.

1 Answers1

4

I tested at my side, and everything was OK.

You may get my demo at: https://github.com/AI-EVO/azuresptingfunction.git . The project is based on the official demo: https://github.com/Azure-Samples/hello-spring-function-azure

My changes:

HelloFunction.java

@SpringBootApplication
public class HelloFunction {

    public static void main(String[] args) throws Exception {
        SpringApplication.run(HelloFunction.class, args);
    }

    @Bean("hello")
    public Function<User, Greeting> hello() {
        return user -> new Greeting("Hello! Welcome, " + user.getName());
    }

    @Bean("hi")
    public Function<User, Greeting> hi() {
        return user -> new Greeting("Hi! Welcome, " + user.getName());
    }
}

Modify HelloHandler.java

public class HelloHandler extends AzureSpringBootRequestHandler<User, Greeting> {

    @FunctionName("hello")
    public Greeting execute(
            @HttpTrigger(name = "request", methods = {HttpMethod.GET, HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Optional<User>> request,
            ExecutionContext context) {

        context.getLogger().info("Greeting user name: " + request.getBody().get().getName());
        return handleRequest(request.getBody().get(), context);
    }
}

Add HiHandler.java

public class HiHandler extends AzureSpringBootRequestHandler<User, Greeting> {

    @FunctionName("hi")
    public Greeting execute(@HttpTrigger(name = "request", methods = { HttpMethod.GET,
            HttpMethod.POST }, authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Optional<User>> request,
            ExecutionContext context) {

        context.getLogger().info("Greeting user name: " + request.getBody().get().getName());
        return handleRequest(request.getBody().get(), context);
    }
}

Run functions:

mvn azure-functions:run

enter image description here

Test with postman

From function hello:

enter image description here

From function hi:

enter image description here

Jack Jia
  • 5,268
  • 1
  • 12
  • 14
  • Thank you for this! I have also tried putting the 2 beans in a separate class annotated with Configuration. I think the problem with my original code was that I was mixing up the bean definition, the autowiring (as implied in AzureSpringBootRequestHandler), and the Configuration all in one class. – Sean Archer Oct 28 '19 at 23:49
  • Any idea why building fails for default test cases? – Musa Sep 14 '20 at 14:22
  • What if I need to access the ExecutionContext from the Function hello method? I tried autowiring the context and simply providing it as a parameter. Is this possible? – wheeleruniverse May 09 '21 at 04:58