java-无法为JAX-B生成架构,仅在CORS调用REST服务期间发生
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java-无法为JAX-B生成架构,仅在CORS调用REST服务期间发生,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含6421字,纯文字阅读大概需要10分钟。
内容图文
![java-无法为JAX-B生成架构,仅在CORS调用REST服务期间发生](/upload/InfoBanner/zyjiaocheng/681/512233614d5f4e89a1200e7bf2d91f25.jpg)
我开发了可在Glassfish 4中运行的REST服务/资源,还开发了AngularJS中的UI.当我通过WAR文件(以及REST代码)将UI代码部署到Glassfish并通过访问Glassfish应用程序(http://localhost:8080)的浏览器直接测试访问时,一切正常.
但是,奇怪的是,当我将UI代码分别部署到Tomcat服务器(在端口8090上运行)时,其中一个GET请求(返回的响应类型为Map keyValues = new HashMap();实体). .甚至都不访问我的任何实体类),我在Glassfish服务器日志中收到以下错误:
严重:无法为JAX-B元素生成架构
com.sun.xml.bind.v2.runtime.IllegalAnnotationsException:2个IllegalAnnotationExceptions计数
属性“ salesOrderUid”具有XmlID注释,但其类型不是String.
此问题与以下位置有关:
在public int business.salesOrderMgmt.entity.SalesOrder.getSalesOrderUid()
在business.salesOrderMgmt.entity.SalesOrder
在private business.salesOrderMgmt.entity.SalesOrder上at business.salesOrderMgmt.entity.SalesOrderLine.salesOrder
在business.salesOrderMgmt.entity.SalesOrderLine
在私有java.util.List上的business.salesOrderMgmt.entity.CatalogItem.salesOrderLines
在business.salesOrderMgmt.entity.CatalogItem
在私有java.util.List上的business.salesOrderMgmt.entity.Item.catalogItems
在business.salesOrderMgmt.entity.Item
在private business.salesOrderMgmt.entity.Item business.salesOrderMgmt.entity.ProductCategoryItem.item
在business.salesOrderMgmt.entity.ProductCategoryItem
该类具有两个相同名称的属性“ salesOrderUid”
此问题与以下位置有关:
在public int business.salesOrderMgmt.entity.SalesOrder.getSalesOrderUid()
在business.salesOrderMgmt.entity.SalesOrder
在private business.salesOrderMgmt.entity.SalesOrder上at business.salesOrderMgmt.entity.SalesOrderLine.salesOrder
在business.salesOrderMgmt.entity.SalesOrderLine
在私有java.util.List上的business.salesOrderMgmt.entity.CatalogItem.salesOrderLines
在business.salesOrderMgmt.entity.CatalogItem
在私有java.util.List上的business.salesOrderMgmt.entity.Item.catalogItems
在business.salesOrderMgmt.entity.Item
在private business.salesOrderMgmt.entity.Item business.salesOrderMgmt.entity.ProductCategoryItem.item
在business.salesOrderMgmt.entity.ProductCategoryItem
此问题与以下位置有关:
在私人int business.salesOrderMgmt.entity.SalesOrder.salesOrderUid
在business.salesOrderMgmt.entity.SalesOrder
在private business.salesOrderMgmt.entity.SalesOrder上at business.salesOrderMgmt.entity.SalesOrderLine.salesOrder
在business.salesOrderMgmt.entity.SalesOrderLine
在私有java.util.List上的business.salesOrderMgmt.entity.CatalogItem.salesOrderLines
在business.salesOrderMgmt.entity.CatalogItem
在私有java.util.List上的business.salesOrderMgmt.entity.Item.catalogItems
在business.salesOrderMgmt.entity.Item
在private business.salesOrderMgmt.entity.Item business.salesOrderMgmt.entity.ProductCategoryItem.item
在business.salesOrderMgmt.entity.ProductCategoryItem
并且在Chrome控制台中,我收到以下错误(我相信这是误导性的,因为我是在将响应对象返回给客户端/请求者之前在服务器端设置了“ Access-Control-Allow-Origin”标头.
所请求的资源上没有“ Access-Control-Allow-Origin”标头.因此,不允许访问来源’http://localhost:8090‘.
我认为Chrome /客户端错误会引起误解,因为在服务器端,我向每个响应添加了标头(“ Access-Control-Allow-Origin”,“ http://localhost:8090”)…适用于其他请求,为什么不这不行吗?
对我来说,最奇怪的是,REST资源方法没有访问据称具有无效ID类型的实体类.它正在调用一项服务,以使用传递给服务的参数来计算税金和运费,这些参数代表promotionCode,zipCode和subTotal-不会访问SalesOrder实体对象.
此特定的REST调用与其他有效的调用之间有两个区别:
1)该特定调用将参数与请求一起传递,而其他则没有,并且
2)此请求过滤器检测HTTP方法(OPTIONS).
请注意,而不是在我所有的REST资源方法上,我都将以下内容作为方法参数“ resourceMethod(@QueryParam(“ callback”)String callback,….)“.
有什么想法可能导致这些神秘的错误吗?
解决方法:
如我所料,这些错误非常容易引起误解,与问题无关.浏览器正在用OPTIONS请求“抢占” GET请求,而该OPTIONS请求没有向浏览器返回预期的信息,以指示浏览器/客户端应用程序可以继续.
我必须做两件事:1)在请求过滤器中捕获OPTIONS方法并在响应上设置标头,以及2)在响应过滤器中设置标头以允许CORS以及方法和其他标头…代码片段如下:
@Provider
@PreMatching
public class RESTRequestFilter implements ContainerRequestFilter {
private final static Logger log = Logger.getLogger( RESTRequestFilter.class.getName() );
@Override
public void filter( ContainerRequestContext requestCtx ) throws IOException {
log.info( "Executing REST request filter" );
requestCtx.getHeaders().add( "Access-Control-Allow-Credentials", "true" );
requestCtx.getHeaders().add( "Access-Control-Allow-Origin", "http://localhost:8090");
requestCtx.getHeaders().add( "Access-Control-Allow-Methods", "OPTIONS, GET, POST, DELETE, PUT" );
requestCtx.getHeaders().add( "Access-Control-Allow-Headers", "Content-Type" );
// When HttpMethod comes as OPTIONS, just acknowledge that it accepts...
if ( requestCtx.getRequest().getMethod().equals( "OPTIONS" ) ) {
log.info( "HTTP Method (OPTIONS) - Detected!" );
// Just send a OK signal back to the browser (Abort the filter chain with a response.)
Response response = Response.status( Response.Status.OK )
.header("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT")
.header("Access-Control-Allow-Origin", "http://localhost:8090")
.header("Access-Control-Allow-Headers", "Content-Type, accept, headers")
.build();
requestCtx.abortWith( response );
}
}
}
@Provider
@PreMatching
public class RESTResponseFilter implements ContainerResponseFilter {
private final static Logger log = Logger.getLogger( RESTResponseFilter.class.getName() );
@Override
public void filter( ContainerRequestContext requestCtx, ContainerResponseContext responseCtx ) throws IOException {
log.info( "Executing REST response filter" );
// The following was required to permit testing outside the Application Server Container
// responseCtx.getHeaders().add( "Access-Control-Allow-Origin", "http://127.0.0.1:53307" );
responseCtx.getHeaders().add( "Access-Control-Allow-Origin", "http://localhost:8090");
responseCtx.getHeaders().add( "Access-Control-Allow-Credentials", "true" );
responseCtx.getHeaders().add( "Access-Control-Allow-Methods", "OPTIONS, GET, POST, DELETE, PUT" );
responseCtx.getHeaders().add( "Access-Control-Allow-Headers", "Content-Type, Access-Control-Allow-Origin, Access-Control-Allow-Credentials, Access-Control-Allow-Methods, Access-Control-Allow-Headers, Authorization, X-Requested-With" );
}
}
内容总结
以上是互联网集市为您收集整理的java-无法为JAX-B生成架构,仅在CORS调用REST服务期间发生全部内容,希望文章能够帮你解决java-无法为JAX-B生成架构,仅在CORS调用REST服务期间发生所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。