小编Arn*_*sch的帖子

如何为java注释处理器编写自动化单元测试?

我正在尝试使用java注释处理器.我能够使用"JavaCompiler"编写集成测试(事实上我现在正在使用"hickory").我可以运行编译过程并分析输出.问题:即使我的注释处理器中没有任何代码,单个测试也会运行大约半秒钟.这在TDD风格中使用它太长了.

嘲笑依赖关系对我来说似乎很难(我必须模拟整个"javax.lang.model.element"包).有人成功为注释处理器(Java 6)编写单元测试吗?如果不是......你的方法是什么?

java unit-testing annotations annotation-processing

26
推荐指数
3
解决办法
6326
查看次数

为什么"System.arraycopy"使用"Object"而不是"Object []"?

只是好奇:

有人知道为什么该方法System.arraycopy使用的Object类型srcdest?可以完全使用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)

java arrays arraycopy

18
推荐指数
1
解决办法
1259
查看次数

如何使用lucene API(AND(b OR c))创建嵌套的布尔查询?

我有一个索引对象有三个字段(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 lucene api

12
推荐指数
1
解决办法
8219
查看次数

控制行号时的字节码库是什么?

我需要从现有类生成新类(通过生成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?用于此目的的是什么?提示如何做或示例代码将特别有用.

编辑: 提示哪些库不使用,因为要求不能满足也是有帮助的:).

java assembly bcel bytecode-manipulation

11
推荐指数
1
解决办法
2525
查看次数

如何处理将依赖项注入富域模型?

在具有丰富域模型的Web服务器项目中(应用程序逻辑在模型中,而不是在服务中)如何处理将依赖项注入模型对象?你有什么经历?

你使用某种形式的AOP吗?喜欢Springs @Configurable注释?加载时间还是构建时间?你遇到的问题?

你用手动注射吗?那你如何处理不同的实例化场景(通过库创建对象[如Hibernate],用"new"创建对象......)?

或者您是否使用其他方式注入依赖项?

java aop domain-driven-design inversion-of-control

7
推荐指数
1
解决办法
2622
查看次数

"StreamCorruptedException:无效的流标头"的可能原因

我(尝试)使用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 drools

7
推荐指数
1
解决办法
2万
查看次数

如何使用“javax.lang.model.element.ElementVisitor”?

我尝试使用 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)

java annotations

5
推荐指数
1
解决办法
2546
查看次数

无法在JBoss AS 7中使用持久性("无法找到以子部署命名的部署单元")

我尝试使用带有默认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)

java hibernate jboss7.x

5
推荐指数
1
解决办法
1万
查看次数

@Inject似乎不适用于JBoss AS 7

我安装了最新的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注释不起作用.如何追查问题?可能是什么原因?

java dependency-injection jboss7.x

1
推荐指数
1
解决办法
4795
查看次数