Java 在Jax-Ws和Spring容器中使用@Autowire
我有一个带有Spring容器的Jax Ws Metro项目。我无法在SoapHandler中自动关联字段。我尝试了互联网资源的一切,但没有成功。该字段始终为空。字段名为“paymentPortalService” 我的处理程序类:Java 在Jax-Ws和Spring容器中使用@Autowire,java,spring,web-services,jax-ws,spring-ioc,Java,Spring,Web Services,Jax Ws,Spring Ioc,我有一个带有Spring容器的Jax Ws Metro项目。我无法在SoapHandler中自动关联字段。我尝试了互联网资源的一切,但没有成功。该字段始终为空。字段名为“paymentPortalService” 我的处理程序类: public class CustomSoapHeaderHandler extends SpringBeanAutowiringSupport implements SOAPHandler<SOAPMessageContext> { privat
public class CustomSoapHeaderHandler extends SpringBeanAutowiringSupport implements SOAPHandler<SOAPMessageContext> {
private static final Logger log = Logger.getLogger(CustomSoapHeaderHandler.class);
@Autowire
private PaymentPortalService paymentPortalService;
}
公共类CustomSoapHeaderHandler扩展SpringBeanAutowiringSupport实现SOAPHandler{
私有静态最终记录器log=Logger.getLogger(CustomSoapHeaderHandler.class);
@自动连线
私人付费门户服务付费门户服务;
}
我有一个代理服务,它调用远程服务。已将此处理程序添加到远程服务调用方法中的handlerchain:
@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);
}
}
@服务
公共类CustomServiceProxy{
私有最终记录器log=Logger.getLogger(CustomServiceProxy.class);
专用远程服务端口;
公共CustomServiceProxy(){
试一试{
psport=new-RemoteService_-Service(新URL(“https://x?wsdl”)).getRemoteServicePort();
Binding Binding=((BindingProvider)psport.getBinding();
列表处理程序=binding.getHandlerChain();
add(新的CustomSoapHeaderHandler());
binding.setHandlerChain(处理器);
}
}
我试图将@Autowire更改为@Resource和其他一些internet解决方案,但没有成功。我使用的是不带EE容器的Apache Tomcat 8
提前感谢!从ivy添加这个罐子
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>
响应对象bean看起来像
@组成部分
公共类ResponseObjectBean{
@JsonProperty(“代码”)
专用int状态码;
@JsonProperty(“msg”)
私有字符串statusMsg;
@JsonProperty(“数据”)
私有对象数据;
//接二连三
}
登录控制器
@RestController
公共类登录控制器{
@自动连线
ResponseObjectBean responseData;
@自动连线
登录服务登录服务;
@RequestMapping(value=“/login”,method=RequestMethod.POST)
公共响应性userLogIn(@RequestBody UserInfoBean UserInfoBean){
对象数据=null;
字符串msg=null;
int状态码;
试一试{
data=logInService.logIn(userInfoBean);
如果(数据!=null){
msg=“成功”;
状态代码=200;
}否则{
msg=“失败”;
statusCode=503;
}
}捕获(数据访问异常){
msg=“失败”;
statusCode=503;
}捕获(例外e){
msg=“失败”;
statusCode=503;
e、 printStackTrace();
}
responseData.setStatusCode(状态代码);
响应数据setStatusMsg(msg);
responseData.setData(数据);
返回新的ResponseEntity(responseData,HttpStatus.OK);
}
}
登录服务类看起来像
@服务
@交易的
公共类登录服务{
@自动连线
罗根多罗根多;
公共UserInfoBean登录(UserInfoBean UserInfoBean)引发DataAccessException{
返回logInDao.upSertUser(userInfoBean);
}
}
登录dao类
@存储库
公共类登录{
@自动连线
私有JdbcTemplate JdbcTemplate;
公共UserInfoBean upSertUser(UserInfoBean UserInfoBean)引发异常{
StringBuilder sql=新的StringBuilder();
整数计数;
UserInfoBean-infoBean=null;
试一试{
//数据库操作的逻辑
返回infoBean;
}
}捕获(例外e){
抛出新异常(e);
}最后{
sql=null;
infoBean=null;
run=null;
}
}
}
为了使用jdbc模板,请在spring.xml中添加以下行
为什么不应该为null
。您正在自己创建CustomSoapHeaderHandler
的实例。它不是由任何类型的容器管理的,无论是jersey还是Spring。所以不会注射任何东西。我建议您阅读jersey文档,该文档非常清楚地解释了如何使用Spring设置jersey。谢谢您的回复!是的,我知道这是一个愚蠢的错误,我把它改为:自动连线私人用户SOAPHeaderHandler用户SOAPHeaderHandler;但它仍然不起作用。处理程序对象为空。我还向CustomSoapHeaderHandler类添加了组件注释。接下来,您的SoapHandler
需要是一个@组件
,我假设您已经设置了组件扫描。(请删除extendsSpringBeanAutowiringSupport
,因为它没有添加任何内容。这不是一件运动衫,而是一个Metro项目。您能否提供一份文档,说明在Jax Ws(Metro)中使用Spring DI的客户端处理程序?组件扫描在同一个包中的其他类中运行良好。您只使用Jax WS构造一个客户端来调用web服务,我假设?其余的是Spring?如果是这样,那么使用java来手动配置,而不是手动配置。然而,您的主要问题只是您的处理程序不是Spring管理的bean,ju让它成为一个。