2017-02-09 21 views
0

Im пытается понять эту конкретную проблему, которую я имею. Использование Spring OXM здесь для реализации Soap WS Consumer.Класс или любой его суперкласс известен этому контексту

У меня есть только соответствующая информация, чтобы объяснить проблему.

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; 
    } 

И клиент LoginClient реализован как,

@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(); 
    } 

Для полноты 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; 
    } 

} 

Однако, когда я пытаюсь,

@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()); 

Я получаю ошибку,

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) 

Из того, что я могу видеть это не терпит неудачу, когда сортировочная в getUserByPrincipal (UserClient), но не на getLoginByUserId (LoginClient).

ответ

1

Это было связано с тем, что оба,

@Autowired 
private UserClient iamUserClient; 

@Autowired 
private LoginClient iamLoginClient; 

были конфликтующих друг с другом. Имея индивидуальный jaxb2Marshaller и передавая это, WebServiceTemplate исправил проблему.

Так LoginWsConfiguration обновлена,

@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; 
    } 
}