OperationHook

Adapter, enrichir, contrôler...

Exemple

Dépendances Maven

<dependency>
	<groupId>com.flower.docs.core</groupId>
	<artifactId>flower-docs-ws-client</artifactId>
	<version>2.4.2.5</version>
</dependency>
<dependency>
	<groupId>com.flower.docs.apis</groupId>
	<artifactId>flower-docs-operation-api</artifactId>
	<version>2.4.2.5</version>
</dependency>
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
	<version>2.1.5.RELEASE</version>
</dependency>

Hook

@RestController
@RequestMapping("/log")
public class SampleOperationHook extends OperationHook
{
    private static final Logger LOGGER = LoggerFactory.getLogger(SampleOperationHook.class);

    @Override
    public void process(OperationContext context) throws TechnicalException, FunctionalException
    {
        LOGGER.info("Processing context={}", context);
    }
}

Sécurité

Accès au hook

Les OperationHook peuvent être sécurisés et Flower peut les consommer en fournissant une authentification BASIC.

Pour mettre en place cette authentification, il est nécessaire de définir une configuration de sécurité Spring.


SecurityConfig.java

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.http.SessionCreationPolicy;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter
{
    @Override
    protected void configure(HttpSecurity http) throws Exception
    {
        http.csrf().disable()
            .exceptionHandling()
            .and()
            .formLogin().disable()
            .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and().httpBasic()
            .and().authorizeRequests().anyRequest().authenticated();
    }
}

Ensuite, il suffit de définir l’utilisateur pouvant consommer le service REST dans le fichier application.properties :

spring.security.user.name=toto
spring.security.user.password=1234

Pour que Flower fournisse l’authentification définie, il est nécessaire de mettre à jour l’abonnement avec la chaîne d’autorisation basic à fournir (générer en ligne grâce à blitter)

Configuration

  • accès au Core ws.url

Gestion des erreurs

Par défaut, lors de l’exécution d’un OperationHook, le Core Flower log les erreurs renvoyées en parsant le corps de la réponse HTTP. Pour renvoyer des exceptions Flower adaptées en fonction du contexte, il faut ajouter dans un objet instancié par Spring le code suivant :

@ExceptionHandler(CodeBasedException.class)
public ResponseEntity<Object> handleCustomException(CodeBasedException ex, WebRequest request)
{
    HttpHeaders headers = new HttpHeaders();
    headers.add("code", ex.getCode());
    headers.add("message", ex.getMessage());
    return new ResponseEntity<Object>(headers, HttpStatus.INTERNAL_SERVER_ERROR);
}


Dans le cas d’OperationHook synchrones, il est possible de renvoyer des messages d’erreurs personnalisés à l’utilisateur final. Pour cela, il est nécessaire d’utiliser le code d’erreur F00039 :

throw ExceptionBuilder.createFunctionalException(F00039, "", "Custom error message");