2017-02-09 1 views
0

Ich versuche zu verstehen, dieses spezielle Problem, das ich habe. Verwenden Sie Spring OXM hier, um einen Soap WS Consumer zu implementieren.Klasse noch irgendeine seiner Super-Klasse ist in diesem Zusammenhang bekannt

Ich füge nur die relevanten Informationen an, um das Problem zu erklären.

LoginWsConfiguration,

@Configuration 
public class LoginWsConfiguration { 

    @Inject 
    private OnboardingProperties onboardingProperties; 

    @Bean 
    Jaxb2Marshaller jaxb2Marshaller() { 
     Jaxb2Marshaller jaxb2Marshaller = new Jaxb2Marshaller(); 
     jaxb2Marshaller 
      .setPackagesToScan("org.openiam.ws.login.api_3_2_6"); 
     try { 
      jaxb2Marshaller.afterPropertiesSet(); 
     } 
     catch (Exception ex) { 
      throw new BeanCreationException(ex.getMessage(), ex); 
     } 
     return jaxb2Marshaller; 
    } 

    @Bean 
    public WebServiceTemplate webServiceTemplate(Jaxb2Marshaller jaxb2Marshaller) { 
     WebServiceTemplate webServiceTemplate = new WebServiceTemplate(); 
     webServiceTemplate.setMarshaller(jaxb2Marshaller); 
     webServiceTemplate.setUnmarshaller(jaxb2Marshaller); 
     webServiceTemplate.setDefaultUri(onboardingProperties.getIAM().getEndpoint().getLogin()); 

     return webServiceTemplate; 
    } 

Und der LoginClient Client wie implementiert wird,

@Component 
public class LoginClient { 

    private static final Logger log = LoggerFactory.getLogger(IAMLoginClient.class); 

    @Autowired 
    private LoginMapper loginMapper; 

    @Inject 
    private OnboardingProperties onboardingProperties; 

    private WebServiceTemplate webServiceTemplate; 

    @Autowired 
    public LoginClient(WebServiceTemplate webServiceTemplate) { 
     this.webServiceTemplate = webServiceTemplate; 
    } 

    public LoginClient() { 
    } 

    public Optional getLoginByUserId(final String userId) { 
     ObjectFactory factory = new ObjectFactory(); 
     GetLoginByUser req = factory.createGetLoginByUser(); 
     req.setUserId(userId); 
     GetLoginByUserResponse resp = (GetLoginByUserResponse)webServiceTemplate.marshalSendAndReceive(req); 
     if (resp != null && resp.getReturn() != null && resp.getReturn().getStatus() == org.openiam.ws.login.api_3_2_6.ResponseStatus.SUCCESS) { 
      List<Login> foundLogins = resp.getReturn().getPrincipalLists(); 
      Login foundLogin = foundLogins.stream() 
       .filter(login -> login.getManagedSysId().equals(Constants.IAM_DEFAULT_MANAGED_SYS_ID)) 
       .findFirst() 
       .orElse(null); 
      return Optional.ofNullable((foundLogin != null) ? this.loginMapper.mapIAMLogin(foundLogin) : null); 
     } 
     return Optional.empty(); 
    } 

Zur Vollständigkeit GetLoginByUser,

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "getLoginByUser", propOrder = { 
    "userId" 
}) 
@XmlRootElement(name = "getLoginByUser") 
public class GetLoginByUser { 

    protected String userId; 

    /** 
    * Gets the value of the userId property. 
    * 
    * @return 
    *  possible object is 
    *  {@link String } 
    *  
    */ 
    public String getUserId() { 
     return userId; 
    } 

    /** 
    * Sets the value of the userId property. 
    * 
    * @param value 
    *  allowed object is 
    *  {@link String } 
    *  
    */ 
    public void setUserId(String value) { 
     this.userId = value; 
    } 

} 

GetLoginByUserResponse,

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "getLoginByUserResponse", propOrder = { 
    "_return" 
}) 
@XmlRootElement(name = "getLoginByUserResponse") 
public class GetLoginByUserResponse { 

    @XmlElement(name = "return") 
    protected LoginListResponse _return; 

    /** 
    * Gets the value of the return property. 
    * 
    * @return 
    *  possible object is 
    *  {@link LoginListResponse } 
    *  
    */ 
    public LoginListResponse getReturn() { 
     return _return; 
    } 

    /** 
    * Sets the value of the return property. 
    * 
    * @param value 
    *  allowed object is 
    *  {@link LoginListResponse } 
    *  
    */ 
    public void setReturn(LoginListResponse value) { 
     this._return = value; 
    } 

} 

Allerdings, wenn ich versuche,

@Autowired 
private UserClient iamUserClient; 

@Autowired 
private LoginClient iamLoginClient; 

Optional<IAMUser> userFromIAM = iamUserClient.getUserByPrincipal(lowercaseLogin); 
IAMUser userIAM = userFromIAM. 
     orElseThrow(() -> new UsernameNotFoundException("User " + lowercaseLogin + " was not found in IAM")); 
    if (userIAM.getStatus() != IAMUserStatus.ACTIVE || userIAM.getAccountStatus() != null) { 
     throw new UserNotActivatedException("User " + lowercaseLogin + " is not active"); 
    } 
Optional<IAMLogin> loginFromIAM = iamLoginClient.getLoginByUserId(userIAM.getId()); 

ich den Fehler,

org.springframework.oxm.UncategorizedMappingException: Unknown JAXB exception; nested exception is javax.xml.bind.JAXBException: class org.openiam.ws.login.api_3_2_6.GetLoginByUser nor any of its super class is known to this context. 
    at org.springframework.oxm.jaxb.Jaxb2Marshaller.convertJaxbException(Jaxb2Marshaller.java:915) 
    at org.springframework.oxm.jaxb.Jaxb2Marshaller.marshal(Jaxb2Marshaller.java:684) 
    at org.springframework.ws.support.MarshallingUtils.marshal(MarshallingUtils.java:81) 
    at org.springframework.ws.client.core.WebServiceTemplate$2.doWithMessage(WebServiceTemplate.java:399) 
    at org.springframework.ws.client.core.WebServiceTemplate.doSendAndReceive(WebServiceTemplate.java:590) 
    at org.springframework.ws.client.core.WebServiceTemplate.sendAndReceive(WebServiceTemplate.java:555) 
    at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:390) 
    at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:383) 
    at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:373) 
    at com.orchestral.dsm.onboarding.iam.ws.login.LoginClient.getLoginByUserId(LoginClient.java:77) 
    at com.orchestral.dsm.onboarding.security.IAMUserDetailsService.loadUserByUsername(IAMUserDetailsService.java:45) 

Von dem, was ich sehen kann nicht fehlschlagen, wenn in getUserByPrincipal (UserClient) Rangier aber nicht auf getLoginByUserId (LoginClient).

Antwort

1

Dies war aufgrund der Tatsache, dass beide,

@Autowired 
private UserClient iamUserClient; 

@Autowired 
private LoginClient iamLoginClient; 

miteinander in Konflikt wurden. Das Problem wurde mit jaxb2Marshaller gelöst und an WebServiceTemplate übergeben.

So LoginWsConfiguration aktualisiert,

@Configuration 
public class LoginWsConfiguration { 

    @Bean 
    Jaxb2Marshaller jaxb2LoginMarshaller() { 
     Jaxb2Marshaller jaxb2Marshaller = new Jaxb2Marshaller(); 
     jaxb2Marshaller.setPackagesToScan("org.openiam.ws.login.api_3_2_6"); 
     return jaxb2Marshaller; 
    } 

    @Bean 
    public LoginClient loginClient(Jaxb2Marshaller jaxb2LoginMarshaller) { 
     LoginClient client = new LoginClient(); 
     client.setMarshaller(jaxb2LoginMarshaller); 
     client.setUnmarshaller(jaxb2LoginMarshaller); 
     client.setDefaultUri("uri"); 

     return client; 
    } 
} 
Verwandte Themen