2017-08-23 4 views
0

Als Teil meiner Rest-API muss ich auf den Operator zugreifen, der im Autorisierungsheader codiert gespeichert ist.Deserializing HeaderParam zu POJO mit Springboot

kann ich diese wie Zugang:

@RequestMapping(method = RequestMethod.POST, consumes = "application/json", produces = "application/json") 
public Customer post(@RequestBody CustomerRequest request, @RequestHeader(name = "Authorization") String authorization) { 
    // Some logic to parse the authorization header here which gets duplicated in every REST method 
    Operator operator = parseAuthorization(authorization); 
} 

Dies ist jedoch ein wenig umständlich und erfordert viel doppelten Code, wenn dieser verwendet wird.

Gibt es eine Weise, die ich diese mit einer benutzerdefinierten Anmerkung tun kann, und irgendeine Form von Middleware wie:

@RequestMapping(method = RequestMethod.POST, consumes = "application/json", produces = "application/json") 
public Customer post(@RequestBody CustomerRequest request, @Operator Operator operator) { 
} 

Antwort

0

Sie Filter oder Abfangjäger verwenden können, bevor man jede Steuerung die Authentication Header zu lesen.

+0

Ich brauche den Inhalt des Headers in meinem Controller wie im gezeigten Beispiel verwenden – Edd

0

Sie können jede Klasse für einen Header-Parameter verwenden, aber Sie müssen Spring konfigurieren, damit der String des Header-Werts in diese Klasse konvertiert werden kann. Der einfachste Weg, dies zu tun, ist ein PropertyEditor.

eine Klasse Authorization implementieren, mit einem Feld für den Operator (hinzufügen Getter, wenn Sie mögen)

public class Authorization{ 
    public Operator operator; 
} 

eine Unterklasse von java.beans.PropertyEditorSupport erstellen, die den Header String in eine Authorization

wandelt

Wichtig Setzen Sie die Klasse AuthorizationEditor in das gleiche Paket wie die Autorisierung, Spring findet sie dort automatisch.

Use Authorization als Typ des Header-Parameter

public Customer post(... @RequestHeader(name = "Authorization") Authorization authorization) 
0

Dieses Beispiel Frühlings-Wandler mit getan werden kann,

@Component 
public class OperatorHeaderConverter implements Converter<String, Operator> { 

    private final AuthenticationService service; 

    @Autowired 
    public OperatorHeaderConverter(AuthenticationService service) { 
     this.service = service; 
    } 

    @Override 
    public Operator convert(String source) { 
     return service.parseAuthorization(source); 
    } 
} 

, die unter Verwendung konfiguriert ist:

@Configuration 
public class ControllerConfiguration extends WebMvcConfigurerAdapter { 

    private final OperatorHeaderConverter operatorHeaderConverter; 

    @Autowired 
    public ControllerConfiguration(OperatorHeaderConverter converter) { 
     this.operatorHeaderConverter = converter; 
    } 

    @Override 
    public void addFormatters (FormatterRegistry registry) { 
     registry.addConverter(operatorHeaderConverter); 
    } 

} 

Und in einem Controller wie verwendet:

@RequestMapping(method = RequestMethod.GET, produces = "application/json") 
public List<CustomerResponse> getCustomers(@RequestHeader(name = "Authorization") Operator operator) { 
    // Do something with the operator 
}