Mi aplicación es tanto servidor SOAP como Cliente, es decir, actúa como un servidor proxy entre los clientes y el proveedor de servicios web. Así que recibo diferentes solicitudes de clientes y haré la validación y las enrutaré al servicio SOAP de destino configurando las configuraciones SSL/TS apropiadas. Estoy usando Spring WS para hacer una llamada de servicio web SOAP. El siguiente código funciona bien:
try { webServiceTemplate.setMessageSender(certManager.setKeystores()); // perform the transaction SOAPResponse = (JAXBElement<Response>) webServiceTemplate .marshalSendAndReceive(SoapRequest); } catch(Exception e) { // catching a broad exception here because many things can go wrong, //but any exception means total failure throw new ServiceException(e); }Pero estoy probando un enfoque diferente en el que configuro la configuración SSL en el interceptor del cliente:
public class AppClientInterceptor implements ClientInterceptor{ private static final Logger LOGGER = LoggerFactory .getLogger(AppClientInterceptor.class); @Autowired WebServiceTemplate webServiceTemplate; @Autowired CertManager certManager; @Override public boolean handleRequest(MessageContext messageContext) throws WebServiceClientException { // pull out the request from the current thread try { LOGGER.info("before setting message sender"); if(webServiceTemplate!=null) webServiceTemplate.setMessageSender(certManager.setKeystores()); else System.out.println("web service tempate is null"); return false; } catch (GeneralSecurityException | IOException e) { // TODO Auto-generated catch block LOGGER.info("In catch block unable to set keystores"); e.printStackTrace(); } return false; }El interceptor del cliente se invoca cuando realizo la llamada al servicio web, pero falla porque la plantilla del servicio web es nula. Conecté la plantilla del servicio web, pero no puedo entender por qué es nula. La plantilla de servicio web que utilicé es la siguiente:
@Bean public WebServiceTemplate webServiceTemplate() { WebServiceTemplate webServiceTemplate = new WebServiceTemplate(); webServiceTemplate.setMarshaller(jaxb2Marshaller()); webServiceTemplate.setUnmarshaller(jaxb2Marshaller()); ClientInterceptor[] interceptors = {new AppClientInterceptor()}; webServiceTemplate.setInterceptors(interceptors); webServiceTemplate.setDefaultUri( "https://destinationserver.com:10072"); return webServiceTemplate; }¿Puedo establecer la configuración SSL en mi interceptor de la manera anterior? ¿Es un enfoque correcto?
Gracias por adelantado
¿Probó la anotación @Configurable antes de la definición de clase?
@Configurable public class AppClientInterceptor implements ClientInterceptor{ ... }