【问题标题】:AngularJS - standalone without web server - Error on calling CXF REST serviceAngularJS - 没有网络服务器的独立 - 调用 CXF REST 服务时出错
【发布时间】:2015-09-08 11:08:10
【问题描述】:

我在 AngularJS 中调用了一个 cxf REST 服务,如果我将 AngularJS 客户端部署为 Web 应用程序,它就可以正常工作。但是当我尝试直接在 Web 服务器外部访问 html 文件时,从 AngularJS 调用 CXF Rest 服务时出现问题。

但如果我直接在浏览器上调用,其余服务 (GET) 可以正常工作。但不是在 AngularJS 中。

我在浏览器中使用以下 URL 访问了 html 文件

file:///C:/angularjs/src/main/webapp/views/index.html

Angular JS 代码

<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
<script type="text/javascript" src="../scripts/vendors/angular.js"></script>

<script type="text/javascript">
    var jayApp = angular.module('jayApp', []);
    jayApp.controller('jayController', function($scope, $http) {

        $http.get("http://localhost:7001/myservice/services/entities").success(function(data) {
            $scope.entities = data;
        });
    })
</script>
</head>
<body>

    <div ng-app="jayApp" ng-controller="jayController">

        <table>
            <thead>
                <tr>
                    <th>Entity Name</th>
                </tr>
            </thead>

            <tbody>
                <tr ng-repeat="entity in entities">
                    <td>{{entity.entityName}}</td>
                </tr>
            </tbody>
        </table>
    </div>


</body>
</html>

错误

Sep 08, 2015 11:47:02 AM org.apache.cxf.jaxrs.utils.JAXRSUtils logMessageHandlerProblem
        SEVERE: Problem with writing the data, class java.util.ArrayList, ContentType: application/json
        <Sep 8, 2015 11:47:02 AM BST> <Error> <org.apache.cxf.jaxrs.utils.JAXRSUtils> <BEA-000000> <Problem with writing the data, class java.util.ArrayList,
        ContentType: application/json>
        Sep 08, 2015 11:47:02 AM org.apache.cxf.phase.PhaseInterceptorChain doDefaultLogging
        WARNING: Interceptor for {http://impl.service.abc.com/}EntityServiceImpl has thrown exception, unwinding now
        org.apache.cxf.interceptor.Fault: An established connection was aborted by the software in your host machine
                at org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor.handleWriteException(JAXRSOutInterceptor.java:371)
                at org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor.serializeMessage(JAXRSOutInterceptor.java:272)
                at org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor.processResponse(JAXRSOutInterceptor.java:118)
                at org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor.handleMessage(JAXRSOutInterceptor.java:81)
                at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308)
                at org.apache.cxf.interceptor.OutgoingChainInterceptor.handleMessage(OutgoingChainInterceptor.java:83)
                at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308)
                at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)
                at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:251)
                at org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:234)
                at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:208)
                at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:160)
                at org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:171)
                at org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:293)
                at org.apache.cxf.transport.servlet.AbstractHTTPServlet.doGet(AbstractHTTPServlet.java:217)
                at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
                at org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:268)
                at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:280)
                at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:254)
                at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:136)
                at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:346)
                at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:243)
                at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3432)
                at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3402)
                at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
                at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
                at weblogic.servlet.provider.WlsSubjectHandle.run(WlsSubjectHandle.java:57)
                at weblogic.servlet.internal.WebAppServletContext.doSecuredExecute(WebAppServletContext.java:2285)
                at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2201)
                at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2179)
                at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1572)
                at weblogic.servlet.provider.ContainerSupportProviderImpl$WlsRequestExecutor.run(ContainerSupportProviderImpl.java:255)
                at weblogic.work.ExecuteThread.execute(ExecuteThread.java:311)
                at weblogic.work.ExecuteThread.run(ExecuteThread.java:263)
        Caused by: java.io.IOException: An established connection was aborted by the software in your host machine
                at sun.nio.ch.SocketDispatcher.write0(Native Method)
                at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:51)
                at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:93)
                at sun.nio.ch.IOUtil.write(IOUtil.java:65)
                at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:471)
                at weblogic.socket.NIOSocketMuxer$NIOOutputStream.writeInternal(NIOSocketMuxer.java:1064)
                at weblogic.socket.NIOSocketMuxer$NIOOutputStream.write(NIOSocketMuxer.java:983)
                at weblogic.servlet.internal.ChunkOutput.writeChunkTransfer(ChunkOutput.java:622)
                at weblogic.servlet.internal.ChunkOutput.writeChunks(ChunkOutput.java:587)
                at weblogic.servlet.internal.ChunkOutput.flush(ChunkOutput.java:472)
                at weblogic.servlet.internal.ChunkOutput$3.checkForFlush(ChunkOutput.java:727)
                at weblogic.servlet.internal.ChunkOutput.write(ChunkOutput.java:378)
                at weblogic.servlet.internal.ChunkOutputWrapper.write(ChunkOutputWrapper.java:153)
                at weblogic.servlet.internal.ServletOutputStreamImpl.write(ServletOutputStreamImpl.java:164)
                at org.apache.cxf.io.AbstractWrappedOutputStream.write(AbstractWrappedOutputStream.java:51)
                at com.fasterxml.jackson.core.json.UTF8JsonGenerator._flushBuffer(UTF8JsonGenerator.java:2003)
                at com.fasterxml.jackson.core.json.UTF8JsonGenerator.writeString(UTF8JsonGenerator.java:436)
                at com.fasterxml.jackson.databind.ser.std.SqlDateSerializer.serialize(SqlDateSerializer.java:51)
                at com.fasterxml.jackson.databind.ser.std.SqlDateSerializer.serialize(SqlDateSerializer.java:18)
                at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:656)
                at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:678)
                at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:156)
                at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serializeContents(CollectionSerializer.java:149)
                at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:111)
                at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:24)
                at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:253)
                at com.fasterxml.jackson.databind.ObjectWriter$Prefetch.serialize(ObjectWriter.java:1384)
                at com.fasterxml.jackson.databind.ObjectWriter.writeValue(ObjectWriter.java:889)
                at com.fasterxml.jackson.jaxrs.base.ProviderBase.writeTo(ProviderBase.java:635)
                at org.apache.cxf.jaxrs.utils.JAXRSUtils.writeMessageBody(JAXRSUtils.java:1372)
                at org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor.serializeMessage(JAXRSOutInterceptor.java:250)
                ... 32 more

        <Sep 8, 2015 11:47:02 AM BST> <Warning> <org.apache.cxf.phase.PhaseInterceptorChain> <BEA-000000> <Interceptor for {http://impl.service.abc.com/}EntityServiceImpl has thrown exception, unwinding now
        org.apache.cxf.interceptor.Fault: An established connection was aborted by the software in your host machine
                at org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor.handleWriteException(JAXRSOutInterceptor.java:371)
                at org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor.serializeMessage(JAXRSOutInterceptor.java:272)
                at org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor.processResponse(JAXRSOutInterceptor.java:118)
                at org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor.handleMessage(JAXRSOutInterceptor.java:81)
                at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308)
                Truncated. see log file for complete stacktrace
        Caused By: java.io.IOException: An established connection was aborted by the software in your host machine
                at sun.nio.ch.SocketDispatcher.write0(Native Method)
                at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:51)
                at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:93)
                at sun.nio.ch.IOUtil.write(IOUtil.java:65)
                at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:471)
                Truncated. see log file for complete stacktrace
        >

CXF 弹簧配置

<jaxrs:server id="mdmCxfServer" address="/">
    <jaxrs:serviceBeans>
        <ref bean="entityService" />
        <ref bean="commonService" />
    </jaxrs:serviceBeans>
    <jaxrs:extensionMappings>
        <entry key="json" value="application/json" />
    </jaxrs:extensionMappings>
    <jaxrs:providers>
        <bean class="com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider" />
    </jaxrs:providers>
    <jaxrs:features>
    <cxf:logging />   
    </jaxrs:features>
</jaxrs:server>

浏览器日志 (F12)

    Error: Access is denied.

   at Anonymous function (https://ajax.googleapis.com/ajax/libs/angularjs/1.4.4/angular.min.js:92:209)
   at q (https://ajax.googleapis.com/ajax/libs/angularjs/1.4.4/angular.min.js:89:65)
   at Anonymous function (https://ajax.googleapis.com/ajax/libs/angularjs/1.4.4/angular.min.js:86:214)
   at Anonymous function (https://ajax.googleapis.com/ajax/libs/angularjs/1.4.4/angular.min.js:118:207)
   at n.prototype.$eval (https://ajax.googleapis.com/ajax/libs/angularjs/1.4.4/angular.min.js:133:28)
   at n.prototype.$digest (https://ajax.googleapis.com/ajax/libs/angularjs/1.4.4/angular.min.js:130:52)
   at n.prototype.$apply (https://ajax.googleapis.com/ajax/libs/angularjs/1.4.4/angular.min.js:133:328)
   at Anonymous function (https://ajax.googleapis.com/ajax/libs/angularjs/1.4.4/angular.min.js:19:477)
   at e (https://ajax.googleapis.com/ajax/libs/angularjs/1.4.4/angular.min.js:39:87)
   at d (https://ajax.googleapis.com/ajax/libs/angularjs/1.4.4/angular.min.js:19:398)

   Error: [$compile:tpload] http://errors.angularjs.org/1.4.4/$compile/tpload?p0=partials%2Flist.html&p1=undefined&p2=undefined
   at Anonymous function (https://ajax.googleapis.com/ajax/libs/angularjs/1.4.4/angular.min.js:144:42)
   at Anonymous function (https://ajax.googleapis.com/ajax/libs/angularjs/1.4.4/angular.min.js:118:207)
   at n.prototype.$eval (https://ajax.googleapis.com/ajax/libs/angularjs/1.4.4/angular.min.js:133:28)
   at n.prototype.$digest (https://ajax.googleapis.com/ajax/libs/angularjs/1.4.4/angular.min.js:130:52)
   at n.prototype.$apply (https://ajax.googleapis.com/ajax/libs/angularjs/1.4.4/angular.min.js:133:328)
   at Anonymous function (https://ajax.googleapis.com/ajax/libs/angularjs/1.4.4/angular.min.js:19:477)
   at e (https://ajax.googleapis.com/ajax/libs/angularjs/1.4.4/angular.min.js:39:87)
   at d (https://ajax.googleapis.com/ajax/libs/angularjs/1.4.4/angular.min.js:19:398)
   at yc (https://ajax.googleapis.com/ajax/libs/angularjs/1.4.4/angular.min.js:20:172)
   at Zd (https://aja

【问题讨论】:

    标签: java angularjs rest cxf


    【解决方案1】:

    您的服务器中似乎没有启用 CORS。

    为此,您需要在配置中包含 cors-filter。

    <beans>
        <bean id="cors-filter" class="org.apache.cxf.rs.security.cors.CrossOriginResourceSharingFilter"/>
        <jaxrs:server id="service" address="/">
            <jaxrs:serviceBeans>
                <ref bean="cors-server" />
            </jaxrs:serviceBeans>
            <jaxrs:providers>
                <ref bean="cors-filter" />
            </jaxrs:providers>
        </jaxrs:server>
    
        <bean id="cors-server" scope="prototype"
              class="org.apache.cxf.systest.jaxrs.cors.AnnotatedCorsServer" /> 
    
    </beans>
    

    并使用@CrossOriginResourceSharing 注释您的端点,如下所示:

    @CrossOriginResourceSharing(allowOrigins = { "*" })
    

    如果您只想出于测试目的进行这些调用,那么您还可以尝试在禁用网络安全的情况下运行浏览器实例...为此,请使用 --disable-web-security 标志启动 chrome

    顺便说一句。后端的错误看起来更像是客户端断开连接。它们与问题无关。

    【讨论】:

    • 非常有用。但是我在添加 org.apache.cxf.systest.jaxrs.cors.AnnotatedCorsServer 的依赖项时遇到了问题。你知道这个兼容的maven依赖吗?我尝试使用 org.apache.cxf.systestscxf-systests-jaxrs3.1.2org.apache.cxfcxf-systests2.2.3。所有这些都会产生错误。
    • 看起来不错...您遇到了哪种错误?
    • 我可以避免使用 cxf-systests 工件并删除 bean 吗? 。我试过这样,但这没有添加所需的标题并且仍然得到错误。 (原因:缺少 CORS 标头“Access-Control-Allow-Origin”)。
    猜你喜欢
    • 1970-01-01
    • 2014-02-01
    • 1970-01-01
    • 2016-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多