2016-08-04 5 views
1

Ich habe ein Jax-Ws Metro-Projekt mit Spring-Container. Ich kann ein Feld innerhalb von SoapHandler nicht automatisch ansteuern. Ich habe alles aus Internetquellen versucht, aber keinen Erfolg. Das Feld ist immer null. Der Feldname lautet "paymentPortalService".Verwenden Sie @Autowire in Jax-Ws mit Spring Container

Meine Handler-Klasse:

public class CustomSoapHeaderHandler extends SpringBeanAutowiringSupport implements SOAPHandler<SOAPMessageContext> { 
    private static final Logger log = Logger.getLogger(CustomSoapHeaderHandler.class); 

    @Autowire 
    private PaymentPortalService paymentPortalService; 
} 

Ich habe einen Proxy-Dienst, die einen Remote-Service aufruft. Hinzugefügt diese Handler in Remote-Service-Call-Methode zu Handler:

@Service 
public class CustomServiceProxy { 
    private final Logger log = Logger.getLogger(CustomServiceProxy.class); 
    private RemoteServicePort pspPort; 


    public CustomServiceProxy() { 
     try { 


     pspPort = new RemoteService_Service(new URL("https://x?wsdl")).getRemoteServicePort(); 

     Binding binding = ((BindingProvider) pspPort).getBinding(); 
     List<Handler> handlers = binding.getHandlerChain(); 
     handlers.add(new CustomSoapHeaderHandler()); 
     binding.setHandlerChain(handlers); 
    } 
} 

Ich versuchte @Autowire @Resource und einige andere Lösungen aus dem Internet zu ändern, keinen Erfolg. Ich benutze Apache Tomcat 8 ohne EE-Container.

Vielen Dank im Voraus!

+0

Und warum sollte es nicht "null" sein. Sie erstellen Instanzen des 'CustomSoapHeaderHandler' selbst. Es wird nicht von irgendwelchen Behältern gehandhabt, sei es Jersey oder Spring. Also wird nichts injiziert. Anstatt zu hacken, empfehle ich eine Lektüre der Trikot-Dokumentation, die ziemlich klar erklärt, wie man Jersey mit Spring einrichtet. –

+0

Danke für Ihre Antwort! Ja, ich weiß, dass dies ein dummer Fehler ist. Ich habe ihn folgendermaßen geändert: Autowired private CustomSoapHeaderHandler customSoapHeaderHandler; Aber es funktioniert immer noch nicht. Das Handler-Objekt ist null. Ich habe der CustomSoapHeaderHandler-Klasse auch die Komponente Annotation hinzugefügt. – 0bj3ct

+0

Wie bereits erwähnt, lesen Sie [die Dokumentation] (https://jersey.java.net/documentation/latest/spring.html) anstatt die falschen Dinge zu probieren. Daneben muss Ihr 'SoapHandler' eine' @ Component' sein und ich nehme an, dass Sie den Komponenten-Scan eingerichtet haben. (Und entfernen Sie bitte die extends "SpringBeanAutowiringSupport", da fügt nichts hinzu. –

Antwort

-1
Add this jar from ivy 

<dependency org="org.springframework" name="spring-aop" rev="4.2.1.RELEASE" transitive="false"/> 
<dependency org="org.springframework" name="spring-beans" rev="4.2.1.RELEASE" transitive="false"/> 
<dependency org="org.springframework" name="spring-context" rev="4.2.1.RELEASE" transitive="false"/> 
<dependency org="org.springframework" name="spring-core" rev="4.2.1.RELEASE" transitive="false"/> 
<dependency org="org.springframework" name="spring-expression" rev="4.1.1.RELEASE" transitive="false"/> 
<dependency org="org.springframework" name="spring-web" rev="4.2.1.RELEASE" transitive="false"/> 
<dependency org="org.springframework" name="spring-webmvc" rev="4.2.1.RELEASE" transitive="false"/> 
<dependency org="org.springframework" name="spring-jdbc" rev="4.2.5.RELEASE" transitive="false"/> 
<dependency org="org.springframework" name="spring-tx" rev="4.2.5.RELEASE" transitive="false"/> 
<dependency org="com.fasterxml.jackson.core" name="jackson-annotations" rev="2.7.4" transitive="false"/> 
<dependency org="com.fasterxml.jackson.core" name="jackson-core" rev="2.7.4" transitive="false"/> 
<dependency org="com.fasterxml.jackson.core" name="jackson-databind" rev="2.7.4" transitive="false"/> 
<dependency org="mysql" name="mysql-connector-java" rev="5.1.39" transitive="false"/> 
<dependency org="org.apache.commons" name="commons-dbcp2" rev="2.1.1" transitive="false"/> 
<dependency org="org.apache.commons" name="commons-pool2" rev="2.4.2" transitive="false"/> 

A response object bean looks like 

@Component 
public class ResponseObjectBean { 
    @JsonProperty("code") 
    private int statusCode; 
    @JsonProperty("msg") 
    private String statusMsg; 
    @JsonProperty("data") 
    private Object data; 

    //getter and setter 
} 

A log in controller 

@RestController 
public class LogInController { 

    @Autowired 
    ResponseObjectBean responseData; 

    @Autowired 
    LogInService logInService; 

    @RequestMapping(value = "/login", method = RequestMethod.POST) 

    public ResponseEntity<ResponseObjectBean> userLogIn(@RequestBody UserInfoBean userInfoBean) { 
     Object data = null; 
     String msg = null; 
     int statusCode; 
     try { 
      data = logInService.logIn(userInfoBean); 

      if (data != null) { 
       msg = "success"; 
       statusCode = 200; 
      } else { 
       msg = "fail"; 
       statusCode = 503; 
      } 
     } catch (DataAccessException e) { 

       msg = "fail"; 
       statusCode = 503; 
     } catch (Exception e) { 

       msg = "fail"; 
       statusCode = 503; 
      e.printStackTrace(); 
     } 

     responseData.setStatusCode(statusCode); 
     responseData.setStatusMsg(msg); 
     responseData.setData(data); 
     return new ResponseEntity<ResponseObjectBean>(responseData, HttpStatus.OK); 

    } 

} 


A log in Service class looks like 

@Service 
@Transactional 
public class LogInService { 

    @Autowired 
    LogInDao logInDao; 

    public UserInfoBean logIn(UserInfoBean userInfoBean) throws DataAccessException { 
     return logInDao.upSertUser(userInfoBean); 

    } 

} 


A log in dao class 
@Repository 
public class LogInDao { 

    @Autowired 
    private JdbcTemplate jdbcTemplate; 

    public UserInfoBean upSertUser(UserInfoBean userInfoBean) throws Exception { 
     StringBuilder sql = new StringBuilder(); 
     int count; 
     UserInfoBean infoBean = null; 

     try { 
      // your logic for db operation 
       return infoBean; 
      } 
     } catch (Exception e) { 
      throw new Exception(e); 
     } finally { 
      sql = null; 
      infoBean = null; 
      run = null; 
     } 

    } 

} 

for use jdbc templete add these line in your spring.xml 

    <!-- jdbcTemplate uses dataSource --> 
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> 
     <property name="dataSource" ref="dataSource" /> 
    </bean> 

    <!-- dataSource configuration --> 
    <bean id="dataSource" destroy-method="close" 
     class="org.apache.commons.dbcp2.BasicDataSource"> 
     <property name="driverClassName" value="your driverClassName" /> 
     <property name="url" value="your url" /> 
     <property name="username" value="db username" /> 
     <property name="password" value="db password" /> 
    </bean> 
Verwandte Themen