当前位置: 首页 > 知识库问答 >
问题:

从Java1.6切换到1.7会导致JAXB异常

江华容
2023-03-14

我最近遇到了一个问题,我们的一个遗留应用程序依赖于UPS跟踪API。UPS更改了其通信协议以要求TLSv1。2.不幸的是,JDK1.6的最新公共版本似乎不支持此协议,因此我的选择是支付oracle支持合同或升级到JDK1.7。我升级到了1.7

我改变了项目的依赖关系,一切看起来都很好。当我尝试实际部署到应用程序服务器时,失败了,错误如下:

com.sun.xml.bind.v2.runtime.IllegalAnnotationsExceptions: 1计数的IllegalAnnotationExceptionsjava.lang.StackTraceElement没有无arg默认构造函数

我做了一些研究,显然这个问题是由jaxb@WebMethod注释的方法引起的,这些方法抛出了一个带有throwable的异常。我认为解决这个问题的办法是在exception类中添加@WebFault注释。我按照这里的指示:http://java.globinch.com/enterprise-java/web-services/jax-ws/jax-ws-exceptions-faults-annotation-exception-and-fault-handling-examples/并重新部署。

结果是同样的错误。唯一的区别是,我的stackTrace指示它正在使用我的自定义错误bean,而不是试图生成包装器。我还研究了这里给出的解决方案:将异常映射到错误,据我所知,我的类符合规范,但问题仍然存在。

这个问题使我无法修复UPS问题,并给我的用户带来了很大的麻烦。任何帮助都将不胜感激。

我的错误日志

原因:org。jboss。ws。WSException:未能在jaxb上创建JAXBContext。冬眠XMLAcccesorAvailableContextFactory。在org上创建上下文(xmlaccesoravailablecontextfactory.java:41)。jboss。ws。元数据。建设者jaxws。JAXWSMetaDataBuilder。createJAXBContext(JAXWSMetaDataBuilder.java:940)。。。又有82人因:com。太阳xml。绑定v2。运行时。IllegalAnnotationsException:1个IllegalAnnotationException java计数。lang.StackTraceeElement没有无参数默认构造函数。这个问题与以下位置有关:在java。公共java上的lang.StackTraceeElement。lang.StackTraceeElement[]java。可丢弃的。java上的getStackTrace()。可以在私有java中丢弃。lang.Throwable[]com。图拉。常见的服务器服务地址验证。地址服务错误。在com上被禁止。图拉。常见的服务器服务地址验证。地址服务故障

在com.sun.xml.bind.v2.runtime.IllegalAnnotationsExcema$Builder.check(IllegalAnnotationsException.java:106)

异常类

@WebFault(faultBean = "com.tura.common.server.service.addressvalidation.AddressServiceFault")
public class AddressValidationServiceException extends Exception {

    private AddressServiceFault faultInfo;

    public AddressValidationServiceException() {
        super();
    }
    public AddressValidationServiceException(AddressServiceFault fault) {
        super(fault.getFaultString());
        this.faultInfo = fault;
    }

    public AddressValidationServiceException(String message, AddressServiceFault fault) {
        super(message);
        this.faultInfo = fault;
    }

    public AddressValidationServiceException(String message, Throwable cause) {
        super(message, cause);
    }

    public AddressValidationServiceException(String message, AddressServiceFault fault, Throwable cause) {
        super(message, cause);
        this.faultInfo = fault;
    }

    protected AddressServiceFault getFaultInfo() {
        return faultInfo;
    }
}

faultbean类

public class AddressServiceFault {

    private String faultCode;

    private String faultString;

    protected String getFaultCode() {
        return faultCode;
    }

    protected void setFaultCode(String faultCode) {
        this.faultCode = faultCode;
    }

    protected String getFaultString() {
        return faultString;
    }

    protected void setFaultString(String faultString) {
        this.faultString = faultString;
    }
}

我的Web服务类

@WebMethod
    public @WebResult(name = "validatedAddresses") String parseAddressStringByLocation(
            @WebParam(name = "sLocation") String sLocation) throws AddressValidationServiceException {
        StringBuffer sbUrl = new StringBuffer();
        StringBuffer sbQueryString = new StringBuffer();

        sbUrl.append("http://test.foo.com");

        try {
            sbQueryString.append("&location=");
            sbQueryString.append(URLEncoder.encode(sLocation, "UTF-8"));
        } catch (UnsupportedEncodingException e) {
            AddressServiceFault serviceFault = new AddressServiceFault();
            serviceFault.setMessage("Validation Failed");
            throw new AddressValidationServiceException("Address Validation Error: parseQueryStringByLocation.",
                    serviceFault, e);
        }

        sbUrl.append(sbQueryString);

        return sbUrl.toString();
    }

共有3个答案

岳阳文
2023-03-14

您的异常类似乎需要重写getStackTrace()和getCause()方法。看看这里,Domenic D.的答案可能是解决方案。

jaxb-impl版本可能存在问题,本文也介绍了这个问题。

夏侯彬郁
2023-03-14

Throwable对象不能直接序列化为XML,因为StackTraceeElement没有JAXB所需的无参数构造函数。

使用自定义SOAP fault(用@WebFault注释的类),并在soapFault下使用detail元素发送异常详细信息。

蒯慈
2023-03-14

看来还没有人及时想出解决方案,所以我将继续并公布我是如何解决这个问题的。JAX-WS使用反射来确定是否应该包装异常类。因此,它对异常中包含的构造函数和方法非常挑剔。如果仔细查看AddressValidationServiceException类,您会注意到它有以下方法:

protected AddressServiceFault getFaultInfo() {
        return faultInfo;
    }

问题在于该方法的可见性。getFaultInfo()必须是公共方法,否则jax ws将无法正确识别和包装异常类。当我把这个方法改为公开的时候,一切都开始起作用了。事实上,我能够完全删除@WebFault注释。只要异常类和错误的格式正确,就不需要显式注释。

还有一个要注意的问题。Java构造函数不是继承的。如果您有扩展异常的其他类,层次结构中的每个类都必须显式定义

public MyClass(String message, MyServiceFault fault)

public MyClass(String message, MyServiceFault fault, Throwable cause)

构造函数。

 类似资料:
  • 我试图解组xml导致saxparser异常,因为元素的值有一个未正确关闭的标记元素。这是我得到的,我必须处理的。 这里是示例xml- 上面的xml和其他字符串一起作为命令的值,标签没有正确关闭,导致以下异常- [org.xml.sax.saxpasseeption;行号:1;列号:212;元素类型“ctag”后面必须跟有属性规范,” 将xml输入作为字符串阅读器提供给unMarshall 我有两个

  • 我有一个硒项目,直到现在我使用FireFoxDriver,但现在我试图使用ChromeDriver(这是X100更快),我得到分配失败在我的测试与错误元素不可见或元素目前不是棘手的,可能不是操纵" 需要更多的等待吗。直到这是为什么?

  • 我有一个多模块项目设置声纳分析使用方法#2,从分析与SonarQube Runner。 唯一的区别是我不使用全局sonar-project.properties文件。全局属性定义在jenkins在声纳转轮构建步骤。 这与声纳转轮2.3配合非常好。当我从2.3切换到Sonar Runner 2.4时,这将失败,错误是没有定义强制的Sonar.sources属性。 或者有办法告诉Sonar Runne

  • 在使用java程序(带有Eclipse IDE)将leap motion listener从32位windows应用到64位windows后,该程序似乎运行正常。 问题是,现在与控制器的连接已初始化,已连接,然后在我不做任何操作的情况下立即退出。 我试着把手放在控制器上,结果出错了 Java运行时环境检测到一个致命错误: pc=0x000007fee8b4a975,pid=10516时的异常访问(

  • 更新:Oracle已经确认这是一个bug。 Java Beans规范查找返回类型为void的默认setter方法,但它允许通过定制getter和setter方法。最简单的使用方法是指定getter和setter的名称。 这在JDK1.5和JDK1.6中起到了作用,即使它的返回类型不是void,也可以指定setter名称,如下面的测试用例所示: 自定义的示例允许对的编程控制,在Java Beans规

  • 问题内容: 我刚刚将Python3解释器添加到Sublime,并且以下代码停止工作: 我收到以下异常: 我发现这很奇怪,因为据我所知Python3应该在任何地方都支持utf-8。而且,相同的精确代码在Python2.7上可以正常工作。我已经读过有关添加环境变量的信息,但是我尝试了- 无济于事(但是,在OS X Mavericks中添加环境变量似乎并不容易,所以也许我在添加变量时做错了什么? /et