我正在将项目从JAXB 1.0迁移到JAXB 2.1,我遇到了数据类型映射问题.
我正在使用Ant xjc绑定编译器,并且我已经成功配置了全局绑定,例如xs:date映射到java.util.Calendar.
但是我得到的生成方法返回Boolean
,而我想要boolean
.
这是复杂的类型:
<xs:element name="usage-auth-rate-charge">
<xs:complexType>
<xs:sequence>
<xs:element name="service-id" type="xs:string"/>
<xs:element name="pricepoint_custom_fields_required" type="xs:boolean" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
Run Code Online (Sandbox Code Playgroud)
生成的类看起来像这样:
public class UsageAuthRateCharge {
........
public Boolean isPricepointCustomFieldsRequired() {
return pricepointCustomFieldsRequired;
}
Run Code Online (Sandbox Code Playgroud)
问题是虽然装箱会起作用,但如果提供的XML不包含值pricepoint_custom_fields_required
,则类的布尔字段为空,而不是false.这样做的时候我得到NullPointerExceptions:
methodWhichTakesPrimitiveBooleanArg(myUsageAuthRateChargeInstance.isPricepointCustomFieldsRequired());
Run Code Online (Sandbox Code Playgroud)
因为它试图取消传入的布尔值 - 除了它为空.
我无法更改架构,我无法调整所有客户端代码来进行空检查.
我在binding.xml中设置了optionalProperty属性,如下所示:
<globalBindings optionalProperty="primitive">
Run Code Online (Sandbox Code Playgroud)
在规范中,它说:"如果属性的值是"原始的",它会像在JAXB 1.0中那样绑定"
然而,这显然没有发生.
我怎么解决这个问题?
更新:
这现在在jaxb 2.2.9中修复:https://java.net/jira/browse/JAXB/fixforversion/16850
我们正在尝试将多个模块应用程序移动到maven,并遇到一些问题.
每个模块都独立存储在cvs中.我们为每个应用程序提供了清单文件,列出了该应用程序所需的模块(以及可选的版本).并非所有模块都是maven形式.
因此,应用程序'customer_care'具有以下清单:
<manifest>
<module id="MY_api"/>
<module id="custcare_webapp"/>
</manifest>
Run Code Online (Sandbox Code Playgroud)
同样,应用程序"核心批处理"有一个这样的清单:
<manifest>
<module id="MY_api"/>
<module id="core"/>
<module id="batch"/><!--NB this is a non-maven module -->
</manifest>
Run Code Online (Sandbox Code Playgroud)
我已经开始'mavenising'我们的代码,所以MY_api项目有一个定义了依赖项的pom.xml,包括另一个内部代码模块'central_config'.我已指定版本RELEASE.
这一切都很好,直到我需要创建一个冻结的清单.我可以为每个模块指定一个版本:
<manifest>
<module id="MY_api" version="0.123.0"/>
<module id="core" version="0.456.0"/>
<module id="batch" version="0.789.0"/><!--NB this is a non-maven module -->
</manifest>
Run Code Online (Sandbox Code Playgroud)
但是这个构建是不可重现的,因为MY_api中'centralconfig'依赖的版本是'RELEASE'.因此,如果有人发布了新版本的"centralconfig",那么下次我们构建这个冻结的清单时,就会有所不同.
那么为什么我们不使用像central-config这样的依赖关系的硬编码版本呢?因为那样,每当有人将centralconfig更新到新版本时,我们就必须更新10或20个pom文件.依赖于中央配置的所有东西,以及依赖于它的所有内容,都需要更新pom.xml并重新发布.这不仅是很多工作,我不知道如何以编程方式可靠地识别声明依赖于中央配置的每个模块.
我可以在一个地方定义'centralconfig.version',然后在我的所有模块中引用它吗?如果是这样,我应该在哪里这样做?我对父母不太了解,但我觉得他们可能会提供解决方案.
似乎使用父pom是可行的方法.但根据这个问题: maven项目可以有多个父母吗?,maven儿童项目不可能拥有多个父母.
那么,MY_api模块如何成为custcare_webapp和core_batch的子项?
我已经得出结论,maven不符合我的要求,我们已经回到使用我们12年的本土解决方案构建使用ant和CVS.
我的Eclipse崩溃了,我刚刚花了一个小时设置的工作集现在不见了.
但是当我尝试创建一个具有相同名称的新工作集时,它会说"已经存在具有该名称的工作集".
如果它存在,它在哪里?我在我的工作区找不到它...如果它不存在,为什么我不能创建一个同名的新的呢?
我尝试刷新我的工作区(F5),并运行./eclipse -clean - 没有快乐.
我在jboss 5.0.1GA容器中使用jaxb,并在启动时看到一个奇怪的异常.它只出现一次.
从堆栈跟踪中,您可以看到它是在FrameworkUtil类的类初始化期间.
FrameworkUtil第119行看起来像这样:
JAXBContext j = JAXBContext.newInstance(Validate.class, Response.class ....<more classes>);
Run Code Online (Sandbox Code Playgroud)
Validate.java中有这个:
@XmlRootElement(name="validate")
public class Validate {
List<String> userGroups;
@XmlElementWrapper(name="userGroups")
@XmlElement(name="item")
public String[] getUserGroups() {
if (userGroups != null) {
return userGroups.toArray(new String[userGroups.size()]);
}
else return null;
}
public void setUserGroups(String[] userGrps) {
userGroups = new ArrayList<String>();
if (userGrps != null) {
for (String userGrp : userGrps) {
userGroups.add(new String(userGrp));
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
在堆栈跟踪中是一个引用Validate
.但有时堆栈跟踪是不同的,而是指代相同的字段(userGroups
)Response.class
.
这是堆栈跟踪:
Mar 19, 2015 11:20:50 AM com.sun.xml.bind.v2.runtime.reflect.opt.Injector inject
WARNING: …
Run Code Online (Sandbox Code Playgroud) 我最近开始使用maven和eclipse.
我已经设置了几个项目,我注意到如果我尝试指定项目目录之外的构建目录(覆盖目标),那么在执行"更新项目"时会出错:
'更新Maven项目'遇到了问题.
在"更新MAven项目"期间发生内部错误.路径必须包含项目和资源名称:/ [我的项目名称]
我需要在项目之外进行构建.我怎么能绕过这个?我可以让maven自动创建一个软链接吗?
我们最近将我们的大型webapp(在jboss 5上运行)从java 6升级到java 7.
几个小时之后,我们看到了一个OutOfMemory错误,它看起来就像是本机堆耗尽了.
我们运行32位JVM,因此限制为4GB,JVM分配为2GB.
在java 6下,整个进程占用了大约2.3GB,但是对于java 7,这大大增加了,我们达到了4GB的限制而没有触发完整的GC,因为Java堆还没有满.
堆栈跟踪显示XML解组代码在每个请求上创建新的SAXParserFactory,而用于解压缩jar文件的Inflater类在本机堆中存储大量数据(~200,000 Inflater实例).这对我来说效率相当低 - 无论是新的SAXParserFactory还是多个Inflaters.也许这是一个红鲱鱼,但我没有这个比较行为的java 6版本.
通过每隔几个小时手动运行gc,应用程序可以快乐地连续几天没有任何问题.但那不是解决方案.
问题是为什么内存分配增加了1.5GB,我该如何阻止这种情况发生呢?
我希望更新的java版本更高效,更快,等等.但相反,我们看起来像JVM中的内存泄漏.
无论如何,堆栈跟踪如下:
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (malloc) failed to allocate 512128 bytes for Chunk::new
# An error report file with more information is saved as:
# /opt/SP/apps/er_core/current/hs_err_pid25455.log
00:49:30,072 ERROR [[DecouplingProcessServlet]] Servlet.service() for servlet DecouplingProcessServlet threw exception
java.lang.OutOfMemoryError
at java.util.zip.Inflater.init(Native Method)
at java.util.zip.Inflater.<init>(Inflater.java:101)
at java.util.zip.ZipFile.getInflater(ZipFile.java:450)
at java.util.zip.ZipFile.getInputStream(ZipFile.java:369)
at org.jboss.virtual.plugins.context.zip.ZipFileWrapper.openStream(ZipFileWrapper.java:214)
at org.jboss.virtual.plugins.context.zip.ZipEntryContext.openStream(ZipEntryContext.java:1066)
at org.jboss.virtual.plugins.context.zip.ZipEntryHandler.openStream(ZipEntryHandler.java:153) …
Run Code Online (Sandbox Code Playgroud) 我正在从1.x版升级项目到jaxb 2.2.7.
我的应用程序有时会工作,但在一些回复中我看到了这个:
java.lang.RuntimeException: javax.xml.bind.MarshalException
- with linked exception:
[com.sun.istack.SAXException2: Instance of "com.mycompany.global.er.decoupling.binding.response.PricePointType$BalanceImpactRates$BalanceImpactRate"
is substituting "java.lang.Object", but
"com.mycompany.global.er.decoupling.binding.response.PricePointType$BalanceImpactRates$BalanceImpactRate"
is bound to an anonymous type.]
Run Code Online (Sandbox Code Playgroud)
这在jaxb 1.0中运行良好.我不知道问题是什么.
这是xsd的摘录(我无法更改,因为客户端正在使用它):
<xs:complexType name="price-pointType">
<xs:sequence>
<xs:element name="id" type="xs:string" />
.........
<xs:element name="duration" type="durationType" />
<xs:element name="order" type="xs:int" />
<xs:element name="min-sub-period" type="xs:int" />
<xs:element name="balance-impacts" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element name="balance-impact" type="charging-resourceType"
minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="balance-impact-rates" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element name="balance-impact-rate" minOccurs="0"
maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="rate" type="xs:double" />
</xs:sequence>
<xs:attribute name="charging-resource-code" type="xs:string" …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Staxin我们的jboss webapp进行xml验证.我已阅读此帖并按照示例进行操作.然后我看到以下异常:
java.lang.IllegalArgumentException: Source parameter of type
javax.xml.transform.stax.StAXSource' is not accepted by this validator.
at org.apache.xerces.jaxp.validation.ValidatorImpl.validate(Unknown Source)
Run Code Online (Sandbox Code Playgroud)
根据这篇文章,这里的问题是jboss 5.0.1有一个旧版本的xerces.所以我通过替换现有的xercesImpl.jar将其升级到2.11.0 jboss-5.0.1.GA/lib/endorsed/
.然后jboss将无法启动,因为以下错误:
NoClassDefFoundError: org/w3c/dom/ElementTraversal
Run Code Online (Sandbox Code Playgroud)
根据这篇文章,在较新版本的xerces中,类已被拆分为单独的jar文件:xml-apis.jar.我从xerces主页上获取了该文件的最新版本(1.4.01,日期为2009年12月),并将其添加到jboss-5.0.1.GA//lib/endorsed/
- 现在jboss开始正常.
到现在为止还挺好.
但是,当我尝试调用该javax.xml.validation.Validator.validate()
方法时,我现在看到以下错误:
java.lang.IllegalArgumentException: Unrecognized property 'javax.xml.stream.isInterning'
Run Code Online (Sandbox Code Playgroud)
似乎SO上没有存在涉及该属性的问题.当然,我不能成为唯一一个尝试在jboss 5上使用StAX进行xml验证的人?
或者我做了明显错误的事情?
代码段:
Validator validator = requestSchema.newValidator();
StAXSource source = new StAXSource(xmlsr); //an XMLStreamReader
validator.validate(source);
Run Code Online (Sandbox Code Playgroud) 我在 gradle 中发现了一个非常奇怪的问题。
当我运行任何命令时(请参阅下面的 clean),gradle 会失败并出现并发异常。
自从我最近的更改以来,就发生了这种情况。回滚到之前的提交效果很好。
更改太多,无法在此描述,但总而言之,我根据另一个正在运行的项目对构建进行了一些调整。当我说基于时,我的意思是我只是从其他项目复制了 build.gradle、settings.gradle 和 gradle.properties。所有更改均与 Jackson Core 相关。
$ ./gradlew clean
FAILURE: Build failed with an exception.
* What went wrong:
A problem occurred configuring root project 'myservice'.
> java.util.concurrent.ExecutionException: org.gradle.api.GradleException: Failed to create Jar file C:\Users\me\.gradle\caches\jars-9\b868ab677410c01cf9b5a0e29a035e73\jackson-core-2.15.2.jar.
BUILD FAILED in 2s
Run Code Online (Sandbox Code Playgroud)
我尝试删除锁定文件,但失败了:
$ rm -rf ~/.gradle/caches/jars-9/*lock
rm: cannot remove '/c/Users/me/.gradle/caches/jars-9/jars-9.lock': Device or resource busy
Run Code Online (Sandbox Code Playgroud)
所以我运行./gradlew --stop
它停止了 2 个守护进程,并且我能够删除锁定文件。但clean
仍然失败并出现同样的错误。
我尝试清理.gradle
项目中的目录,并且还尝试签出项目的新副本。相同的结果。
因此,尽管它看起来像是一个缓存错误,但我可以通过回滚到以前的提交(不触及缓存)来修复它,并且如果我清除缓存,则不会修复它。
出了什么问题以及如何解决?
我试图重构一个旧的应用程序,以使用EJB3和JPA.
我们有两个客户端层(一个基于servlet,一个不是),它们都调用委托层,该层调用EJB层,后者又调用DAO.EJB是EJB2(bean管理的持久性),DAO使用手动SQL查询,提交事务和手动关闭连接.
我想用EJB3替换EJB2,并将所有DAO更改为使用JPA.
我首先使用容器管理的事务用EJB3替换EJB2代码.由于hibernate Criteria非常简单,并且可以注入EntityManager,我可以这样做:
@Stateless
public class NewSelfcareBean implements SelfcareTcApi {
@PersistenceContext(unitName="core")
EntityManager em;
public BasicAccount getAccount(String id) {
Criteria crit = getCriteria(BasicAccount.class);
crit.add(Restrictions.eq("id", id));
BasicAccount acc = (BasicAccount) crit.uniqueResult();
}
}
Run Code Online (Sandbox Code Playgroud)
无需单独的DAO层.帐户对象看起来有点像这样:
@Entity
@Table(name="er_accounts")
public class BasicAccount {
@OneToMany( mappedBy="account", fetch=FetchType.LAZY)
protected List<Subscription> subscriptions;
}
Run Code Online (Sandbox Code Playgroud)
但是在我调用EJB来获取帐户对象的servlet层中,我想构建一个可能(或可能不)包含来自BasicAccount的子订阅的响应:
servlet层看起来像这样:
ResponseBuilder rb;
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
...
Account acc = getDelegateLayer().getAccount();
rb.buildSubscriptionResponse(acc.getSubscriptions());
...
}
Run Code Online (Sandbox Code Playgroud)
显然这不起作用,因为当我们返回到servlet层时,事务和实体管理器已经关闭 - 我得到一个LazyInitializationException.
所以我可以看到一些选择:
Hibernate.init(acc.getSubscriptions())
- 这将工作,但需要在EJB中完成.假设我重新使用bean作为另一个不需要订阅的客户端方法?不必要的DB调用.