我正在尝试使用java注释处理器.我能够使用"JavaCompiler"编写集成测试(事实上我现在正在使用"hickory").我可以运行编译过程并分析输出.问题:即使我的注释处理器中没有任何代码,单个测试也会运行大约半秒钟.这在TDD风格中使用它太长了.
嘲笑依赖关系对我来说似乎很难(我必须模拟整个"javax.lang.model.element"包).有人成功为注释处理器(Java 6)编写单元测试吗?如果不是......你的方法是什么?
只是好奇:
有人知道为什么该方法System.arraycopy使用的Object类型src和dest?可以完全使用Object[]吗?
为什么定义:
arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
Run Code Online (Sandbox Code Playgroud)
代替
arraycopy(Object[] src, int srcPos, Object[] dest, int destPos, int length)
Run Code Online (Sandbox Code Playgroud)
?
我有一个索引对象有三个字段(userId,标题,描述).我想找到特定用户的所有对象,其中标题或描述包含给定的关键字.
我有类似的东西(但这显然是错的):
WildcardQuery nameQuery = new WildcardQuery(new Term("name", filter.getSearch()));
WildcardQuery descQuery = new WildcardQuery(new Term("description", filter.getSearch()));
TermQuery userQuery = new TermQuery(new Term("user_id", u.getId()+""));
BooleanQuery booleanQuery = new BooleanQuery();
booleanQuery.add(new BooleanClause(name_query, Occur.SHOULD));
booleanQuery.add(new BooleanClause(desc_query, Occur.SHOULD));
booleanQuery.add(new BooleanClause(user_query, Occur.MUST));
Run Code Online (Sandbox Code Playgroud)
如何修改代码以获取具有正确ID的所有对象以及标题或描述中的搜索短语?
我需要从现有类生成新类(通过生成java字节代码).我将分析类的方法的主体(表达式).表达式将决定我将生成什么代码.
对我来说,它是import和设置新类的源文件(与基本java文件相同)以及控制行号(当抛出异常时,stacktrace应该包含基本java文件的行号).
示例:我有文件BaseClass.java.编译器从中生成BaseClass.class.我想分析这个类文件并生成GeneratedClass.class的字节代码.当在c处抛出异常时,stacktrace应包含"BaseClass.java第3行".
BaseClass.java
1: class BaseClass {
2: void method() {
3: call();
4: }
5:}
GeneratesClaas.class
a: class GeneratedClass {
b: void generatedMethod() {
c: generatedCall();
d: }
e:}
Run Code Online (Sandbox Code Playgroud)
我的问题:是否有支持此要求的库?Javassist,ASM还是BCEL?用于此目的的是什么?提示如何做或示例代码将特别有用.
编辑: 提示哪些库不使用,因为要求不能满足也是有帮助的:).
在具有丰富域模型的Web服务器项目中(应用程序逻辑在模型中,而不是在服务中)如何处理将依赖项注入模型对象?你有什么经历?
你使用某种形式的AOP吗?喜欢Springs @Configurable注释?加载时间还是构建时间?你遇到的问题?
你用手动注射吗?那你如何处理不同的实例化场景(通过库创建对象[如Hibernate],用"new"创建对象......)?
或者您是否使用其他方式注入依赖项?
我(尝试)使用drools来处理我的定价规则.但是当我尝试执行规则时,抛出以下异常:
java.lang.RuntimeException: KnowledgeAgent exception while trying to deserialize KnowledgeDefinitionsPackage
at org.drools.agent.impl.KnowledgeAgentImpl.rebuildResources(KnowledgeAgentImpl.java:418)
at org.drools.agent.impl.KnowledgeAgentImpl.applyChangeSet(KnowledgeAgentImpl.java:120)
at org.drools.agent.impl.KnowledgeAgentImpl.applyChangeSet(KnowledgeAgentImpl.java:109)
at com.sapienter.jbilling.server.pluggableTask.PluggableTask.readKnowledgeBase(PluggableTask.java:115)
at com.sapienter.jbilling.server.rule.RulesBaseTask.executeRules(RulesBaseTask.java:57)
at com.sapienter.jbilling.server.item.tasks.RulesPricingTask2.getPrice(RulesPricingTask2.java:81)
at com.sapienter.jbilling.server.item.ItemBL.getPrice(ItemBL.java:357)
[...many not so interesting lines...]
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
at java.lang.Thread.run(Thread.java:619)
Caused by: java.io.StreamCorruptedException: invalid stream header: 3C3F786D
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:783)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:280)
at org.drools.common.DroolsObjectInputStream.<init>(DroolsObjectInputStream.java:55)
at org.drools.common.DroolsObjectInputStream.<init>(DroolsObjectInputStream.java:49)
at org.drools.util.DroolsStreamUtils.streamIn(DroolsStreamUtils.java:189)
at org.drools.util.DroolsStreamUtils.streamIn(DroolsStreamUtils.java:158)
at org.drools.agent.impl.KnowledgeAgentImpl.rebuildResources(KnowledgeAgentImpl.java:408)
... 88 more
Run Code Online (Sandbox Code Playgroud)
由于所有代码都来自库,我猜问题不在代码中,而是在我的项目设置/使用jar /使用规则/等等.这种例外的典型原因是什么?我应该寻找什么来找到异常的原因?有人有策略来查明问题吗?
更新: 有趣...我的应用程序似乎仍然有效.看起来它从错误中恢复过来.那么,也许是我项目库中的错误?不好看到每次启动时记录的错误,但似乎并不重要.嗯......
我尝试使用 java 注释处理器并尝试了解“javax.lang.model”中类的用法。对于我所阅读的内容,我认为 ElementVisitor 旨在作为使用模型的主要方式。但我不明白如何正确使用它。
我知道访客模式。到目前为止,我已经使用它来避免迭代元素的子元素(以及子元素的子元素......)并避免丑陋的“instanceof”测试。但这访客似乎不一样。如果我在模型元素上调用“接受”,它不会访问子元素,而只会访问元素本身。
有人可以提供有关如何使用 API 的帮助吗?
我找到了以下链接:http : //www.cs.bgu.ac.il/~gwiener/programming/visitors-galore/#more-113。但是在另一个内部使用一个访问者......只是感觉不对!?
编辑:为了更容易理解这个问题,我从上面的链接中复制了代码。以下代码似乎不“正确”。我不敢相信官方的 java API 是这样设计的。但是如何正确使用 ElementVisitor 呢?
tElem.accept(new SimpleElementVisitor6<Void, ...>() {
public Void visitType(TypeElement e, ...) {
for (Element tSubElem : e.getEnclosedElements()) {
tSubElem.accept(new SimpleElementVisitor6<AssocEndSpec, ...>() {
public AssocEndSpec visitExecutable(ExecutableElement ex, ...) {
TypeMirror tRetTypeMirror = ex.getReturnType();
tRetTypeMirror.accept(new SimpleTypeVisitor6<TypeElement, TypeElement>() {
public TypeElement visitDeclared(DeclaredType t, TypeElement enclose) {
for (TypeMirror tTypeArgMirror : t.getTypeArguments()) {
tTypeArgMirror.accept(new SimpleTypeVisitor6<TypeElement, ...>() {
public TypeElement visitDeclared(DeclaredType t, TypeElement self) {
TypeElement …Run Code Online (Sandbox Code Playgroud) 我尝试使用带有默认hibernate的JBoss AS 7和JBoss AS附带的默认数据库来实现一个演示.我的实现类似于JBoss的"登录"示例(我有一些额外的项目来实现Web服务并部署为EAR),我无法发现差异.无论如何,我经常得到运行时异常,例如
Caused by: java.lang.RuntimeException: Can't find a deployment unit named at subdeployment "myproject.persistence.war" of deployment "myproject.ear"
at org.jboss.as.weld.services.bootstrap.WeldJpaInjectionServices.getScopedPUName(WeldJpaInjectionServices.java:94) [jboss-as-weld-7.0.2.Final.jar:7.0.2.Final]
at org.jboss.as.weld.services.bootstrap.WeldJpaInjectionServices.resolvePersistenceContext(WeldJpaInjectionServices.java:59) [jboss-as-weld-7.0.2.Final.jar:7.0.2.Final]
at org.jboss.weld.util.Beans.injectEEFields(Beans.java:784) [weld-core-1.1.2.Final.jar:2011-07-26 15:02]
Run Code Online (Sandbox Code Playgroud)
我的MANIFEST.MF
Manifest-Version: 1.0
Dependencies: org.hibernate
Run Code Online (Sandbox Code Playgroud)
我的beans.xml为空.在我的lib文件夹中,我有hibernate jar可以访问本机的hibernate功能.
我的persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
<persistence-unit name="accessControlDatabase">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>
<properties>
<property name="hibernate.hbm2ddl.auto" value="create-drop" />
</properties>
</persistence-unit>
</persistence>
Run Code Online (Sandbox Code Playgroud)
我的两个相关课程:
import javax.enterprise.inject.Produces;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
public class Resources {
@SuppressWarnings("unused")
@Produces
@PersistenceContext(name = "accessControlDatabase")
private EntityManager em;
}
import java.util.List; …Run Code Online (Sandbox Code Playgroud) 我安装了最新的JBoss AS 7(7.0.2)并安装了eclipse工具以将其与WTP连接.我创建了一个"动态Web项目"(没有maven).我试着让"HelloWorld"运行.只有两个班级.
@WebServlet("/HelloWorld")
public class HelloWorldServlet extends HttpServlet {
@Inject
HelloService helloService;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter writer = resp.getWriter();
writer.println("<html><head /><body>");
writer.println("<h1>" + helloService.createHelloMessage("World") + "</h1>");
writer.println("</body></html>");
writer.close();
}
}
public class HelloService {
public String createHelloMessage(String name) {
return "Hello " + name + "!";
}
}
Run Code Online (Sandbox Code Playgroud)
我从eclipse启动服务器,它启动没有错误.但是当从浏览器调用我的servlet(localhost:8080)时,我的代码会抛出一个NPE.
10:28:29,646 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/hello].[hello.HelloWorldServlet]] (http--127.0.0.1-8080-1) Servlet.service() for servlet hello.HelloWorldServlet threw exception: java.lang.NullPointerException
at hello.HelloWorldServlet.doGet(HelloWorldServlet.java:23) [classes:]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:734) [jboss-servlet-api_3.0_spec-1.0.0.Final.jar:1.0.0.Final]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) [jboss-servlet-api_3.0_spec-1.0.0.Final.jar:1.0.0.Final]
[...]
Run Code Online (Sandbox Code Playgroud)
似乎@Inject注释不起作用.如何追查问题?可能是什么原因?