2015-08-04 12 views
9

ho fatto la mia propria implementazione di ClientDetailsService:StackOverflowError in OAuth2 primavera con ClientDetailsService personalizzato

@Service 
public class JpaClientDetailsService implements ClientDetailsService { 
    @Autowired 
    private ClientRepository clientRepositoy; 

    @Override 
    public ClientDetails loadClientByClientId(String clientId) throws ClientRegistrationException { 
     ClientDetails client = clientRepositoy.findOne(clientId); 
     if (client == null) { 
      throw new ClientRegistrationException(String.format("Client with id %s not found", clientId)); 
     } 
     return client; 
    } 
} 

ClientRepository è un JpaRepository standard.

ho configurato un AuthorizationServerConfigurerAdapter come questo:

@Configuration 
@EnableAuthorizationServer 
@EnableResourceServer 
public class OAuth2ServerConfig extends AuthorizationServerConfigurerAdapter { 
    @Autowired 
    private AuthenticationManager authenticationManager; 

    @Autowired 
    private ClientDetailsService clientDetailsService; 

    @Override 
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { 
     endpoints.authenticationManager(authenticationManager); 
    } 

    @Override 
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception { 
     clients.withClientDetails(clientDetailsService); 
    } 
} 

Ma quando vado a http://localhost:9999/oauth/authorize?response_type=code&client_id=lipton, ho un

java.lang.StackOverflowError: null. Spring loops on com.sun.proxy.$Proxy81.loadClientByClientId(Unknown Source).

Non capisco perché.

risposta

6

Non capisco perché, ma se mi inietto il mio fagiolo direttamente invece di iniettare l'interfaccia, funziona:

public class OAuth2ServerConfig extends AuthorizationServerConfigurerAdapter { 
... 
    @Autowired 
    private JpaClientDetailsService clientDetailsService; 
... 

funziona anche se ho annotare il mio servizio con annotazione @Primary:

@Service 
@Primary 
public class JpaClientDetailsService implements ClientDetailsService { 
+0

ho avuto lo stesso problema e dopo l'aggiunta '@ Primary' funziona. L'unica ragione per cui posso vedere qui è che il contesto Spring ha già un bean 'ClientDetailsService' e non era in grado di scegliere il bean corretto – nanachimi

4

Ho avuto un problema simile. Finalmente ho risolto bug quando ho dato il mio clientDetailsService un altro nome ovvero myClientDetailsService e poi iniettato questo nome in classe AuthorizationServerConfig:

@Configuration 
@EnableAuthorizationServer 
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter { 

    @Resource(name = "myClientDetailsService") 
    private ClientDetailsService clientDetailsService; 
... 

penso che se la mia propria implementazione di ClientDetailsService non è stato ancora creata Primavera iniettare in AuthorizationServerConfig qualche tipo di proxy.

Quindi, se si desidera risolvere questo tipo di errore, è necessario assicurarsi che Spring inserisca ClientDetailsService corretto in AuthorizationServerConfig. È possibile raggiungere questo obiettivo se:

  1. dare informazioni primavera sulla preferenza del proprio ClientDetailsService (Arnaud risposta), o
  2. iniettare questo servizio per nome
+0

Ha funzionato anche per me, non posso credere che l'errore non sia gestito meglio dalla primavera, quindi vauge ... – bitsofinfo

1

Che ha finito per lavorare per me è stata aggiunta il ClientDetailsService @Bean alla classe @EnableAuthorizationServer:

@Configuration @EnableAuthorizationServer public class AuthorizationServerConfiguration implements AuthorizationServerConfigurer { ... @Autowired ClientDetailsService clientDetailsService; ... @Bean public ClientDetailsService clientDetailsService() { return new CustomClientDetailsServiceImpl(); } ... }

Problemi correlati