调用webservice的时候出现com.sun.tools.internal.xjc.api.XJC

问题描述:

在单元测试或main方法中是没有问题的,程序不会报错,但是如果用tomcat启动就会报错。java.lang.ClassNotFoundException:com.sun.tools.internal.xjc.api.XJC

示例代码:

public  static String conn(String method,String wsdl_url,String wsdl_namespace,Object... ob) throws Exception{
        JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
        Client client = dcf.createClient(wsdl_url);
        client.getOutInterceptors().add(new ClientLoginInterceptor(Constants.username,Constants.pass));
        QName qName = new QName(wsdl_namespace, method);
        Object[] objects = client.invoke(qName,ob);//list3方法名 后面是可变参数
        System.out.println(objects[0].toString());
        //第一种方式转化
//        Map[] maps = JsonUtils.jsonToPojo(objects[0].toString(), Map[].class);
//        List<Map<String,Object>> list2 = Arrays.asList(maps);
          //第二种方式转化,比较而言,第二种方式友好些,转为自定义实体
//        List<Jyzz> jyzzes = JSON.parseArray(JSON.toJSONString(objects), Jyzz.class);
        return objects[0].toString();
    }
import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.headers.Header;
import org.apache.cxf.helpers.DOMUtils;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

import javax.xml.namespace.QName;
import java.util.List;
//此种方式可以避免写一堆的报文头,类似信封头
public class ClientLoginInterceptor extends AbstractPhaseInterceptor<SoapMessage> {
    //webservice的服务方提供的:用户名和密码
    private String username="";
    private String password="";
    public ClientLoginInterceptor(String username, String password) {
        //设置在发送请求前阶段进行拦截
        super(Phase.PREPARE_SEND);
        this.username=username;
        this.password=password;
    }

    @Override
    public void handleMessage(SoapMessage soapMessage) throws Fault {
        List<Header> headers = soapMessage.getHeaders();
        Document doc = DOMUtils.createDocument();
        Element auth = doc.createElement("check");
        Element UserName = doc.createElement("userName");
        Element UserPass = doc.createElement("pass");

        UserName.setTextContent(username);
        UserPass.setTextContent(password);

        auth.appendChild(UserName);
        auth.appendChild(UserPass);

        headers.add(0, new Header(new QName("check"),auth));
    }
}

解决方式:

这个问题网上大多是说jdk环境的问题,但我的就是用的jdk,不是jre,idea中配置的就是jdk

 而且也把jdk的tools.jar放在了jre的lib下,但是不起作用,还是报错。

最后找到方法,把jaxb-api-2.2.1,jaxb-impl-2.2.1.1,jaxb-xjc-2.2.1.1这三个包引入项目,再启动tomcat或者jetty就运行通过了。

jar包可从http://mvnrepository.com 中下载,务必下载sun-jaxb 的可以引入jar包,当然也可以使用maven依赖:

        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.2.11</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-impl</artifactId>
            <version>2.2.11</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-xjc</artifactId>
            <version>2.2.11</version>
        </dependency>

这个问题纠结大半天,搜了大半天,终于解决了。经实测可以。
 

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值