小编Han*_*ank的帖子

jersey + grizzly + hk2:依赖注入,但不是资源

跟进Jersey + HK2 + Grizzly:注入EntityManager的正确方法?,我想了解如何在不是球衣资源的类中使用依赖注入.

例如,我可能在ExecutorService中运行后台任务,他们可能需要一个EntityManager.如果我尝试@Inject将EntityManager引入该类,则不会发生任何事情.将它注入一个@Path注释的泽西资源类,注入工作正常.

应用程序作为独立的JVM运行,而不是在Java EE应用程序服务器上运行.

更新:我创建了一个测试场景来证明我的意思.代码运行的是一个带有Jersey资源的独立Grizzly服务器,以及一个ExecutorService.A Callable被提交给ExecutorService.

将EntityManager注入资源可以工作,但不能注入Callable.那里的EntityManager仍然存在null.

请告知这里的代码是否比github更好.

java dependency-injection jersey grizzly hk2

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

使用Jersey SSE进行广播:检测已关闭的连接

我相信这个问题不是与Jersey发送事件的重复:在客户端丢弃后EventOutput没有关闭,但可能与Jersey Server-Sent Events有关 - 写入断开的连接不会抛出异常.

在泽西岛文件的第15.4.2章中,描述了SseBroadcaster:

但是,SseBroadcaster在内部识别并处理客户端断开连接.当客户端关闭连接时,广播公司会检测到这种情况,并从已注册的EventOutputs的内部集合中删除过时连接,并释放与过时连接关联的所有服务器端资源.

我无法证实这一点.在下面的测试用例中,我看到子类SseBroadcasteronClose()方法永远不会被调用:不是在EventInput关闭时,而是在广播另一个消息时.

public class NotificationsResourceTest extends JerseyTest {
    final static Logger log = LoggerFactory.getLogger(NotificationsResourceTest.class);

    final static CountingSseBroadcaster broadcaster = new CountingSseBroadcaster();

    public static class CountingSseBroadcaster extends SseBroadcaster { 
        final AtomicInteger connectionCounter = new AtomicInteger(0);

        public EventOutput createAndAttachEventOutput() {
            EventOutput output = new EventOutput();
            if (add(output)) {
                int cons = connectionCounter.incrementAndGet();
                log.debug("Active connection count: "+ cons);
            }
            return output; …
Run Code Online (Sandbox Code Playgroud)

java jersey server-sent-events

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

如何将会话Bean注入消息驱动Bean?

我是Java EE的新手,所以这可能是愚蠢的......请耐心等待:D

我想将一个无状态会话bean注入一个消息驱动的bean.基本上,MDB获取JMS消息,然后使用会话bean来执行工作.会话bean保存业务逻辑.

这是我的会话Bean:

@Stateless
public class TestBean implements TestBeanRemote {

  public void doSomething() {
    // business logic goes here
  }
}
Run Code Online (Sandbox Code Playgroud)

匹配界面:

@Remote
public interface TestBeanRemote {

  public void doSomething();
}
Run Code Online (Sandbox Code Playgroud)

这是我的MDB:

@MessageDriven(mappedName = "jms/mvs.TestController", activationConfig =  {
@ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue")
    })
public class TestController implements MessageListener {

 @EJB
 private TestBean testBean;

    public TestController() {
    }

    public void onMessage(Message message) {
      testBean.doSomething();
    }
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,还不是火箭科学吧?

不幸的是,当将其部署到glassfish v3并向相应的JMS队列发送消息时,我得到了glassfish无法找到TestBean EJB的错误:

java.lang.IllegalStateException: Exception …
Run Code Online (Sandbox Code Playgroud)

glassfish cdi java-ee-6 ejb-3.1 glassfish-3

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

Java:打开设备的输入和输出流

我需要在 Linux 环境下通过 java 与小型标签打印机(通过 ESC/P 的形式)进行交互。打印机可作为字符设备使用,网址为/dev/usb/lp0

发送数据效果很好:

FileOutputStream oStream = new FileOutputStream("/dev/usb/lp0");
BufferedOutputStream lp0out = new BufferendOutputStream(oStream);
byte[] data = new byte[]{0x1b, 0x40}; // ESC, @  = initialise printer
lp0out.write(data);
Run Code Online (Sandbox Code Playgroud)

现在要询问打印机状态,我还需要读取它对特定命令的响应。如何在输入和输出模式下打开设备?发送请求后是否需要关闭输出流,然后打开设备进行输入?

java stream

5
推荐指数
0
解决办法
1403
查看次数

Java:方法链接和依赖注入

在使用由依赖注入框架(比如HK2)管理的服务时,使用方法链是否可以接受?

我不确定是否允许"缓存"实例,即使它仅在注入范围内.

示例服务创建披萨:

@Service
public class PizzaService {

    private boolean peperoni = false;
    private boolean cheese = false;
    private boolean bacon = false;

    public PizzaService withPeperoni() {
        peperoni = true;
        return this;
    }

    public PizzaService withCheese() {
        cheese = true;
        return this;
    }

    public PizzaService withBacon() {
        bacon = true;
        return this;
    }

    public Pizza bake() {
        // create the instance and return it
    }
}
Run Code Online (Sandbox Code Playgroud)

这里将服务注入JAX-RS资源:

@Path('pizza')
public class PizzaResource {

    @Inject
    PizzaService pizzaService;

    @GET
    public Response …
Run Code Online (Sandbox Code Playgroud)

java dependency-injection hk2

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

Grails重定向 - 为什么它总是绝对的?

我有两个Jetty AppServers在Apache 2.2反向代理后运行Grails Web App.SSL终止由apach完成,后者将HTTP传递给Jetty AppServers.

当Grails Web应用程序执行重定向时

redirect(action:'index')
Run Code Online (Sandbox Code Playgroud)

最终用户收到带有完整URL的HTTP 302重定向请求,该URL使用http://协议,而不是https://:

HTTP/1.1 302 Found
Date: Tue, 08 Mar 2011 17:50:46 GMT
Server: Jetty(6.1.17)
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Location: http://hostname.domain/web/?lang=en
Run Code Online (Sandbox Code Playgroud)

这很烦人,因为所有HTTP请求都被代理捕获并重定向到HTTPS请求.所以这是一次不必要的往返.

我看到两个解决方案:

  1. Apache的mod_proxy可以在将响应传递给用户之前将该Location-header重写为https://.(它可以?)
  2. 重定向时,Grails可能根本不使用绝对URL: Location: /web/?lang=en

我认为第一个选择有点愚蠢吧?

你知道如何让grails发送非绝对重定向头(理想情况下无需切换每个重定向uri:)吗?

编辑:目前我通过修改响应标头(a2enmod headers然后添加)Header edit Location ^http://(.*)$ https://$1在第一种方法之后有一个解决方法<Location>.灵感来自这个serverfault帖子.我仍然想知道为什么这首先是必要的.

https grails redirect reverse-proxy

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

从JAX-RS servlet动态创建映像

是否可以创建PNG图像并将其作为JAX-RS资源的一部分直接输出到浏览器?

像这样的东西:

@Path("img/{externalId}")
@Stateless
@Produces({"image/png"})
public class MyImgResource {

  @GET
  public Response (@PathParam("externalId") String externalId) {
    // create image, write to buffered output stream

    return Response.ok().entity(stream).build();
  }
}
Run Code Online (Sandbox Code Playgroud)

这会有用吗?我是否必须处理正确的标题(Content-Type),还是由@Produces注释完成?可以输出图像作为Response?我可以Response从流中构建一个?

java image jax-rs dynamic-image-generation

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

Jersey 2.26:定义自定义注入注释

我正在将一个 JavaSE 应用程序从 Jersey 2.x 迁移到 2.26。该应用程序依赖 HK2 进行依赖注入。

不幸的是,一些官方文档 -自定义注入,第 23 章- 现在不正确并且尚未更新。在他的回答中,Paul 解释了如何将 HK2 迁移FactorySupplier,jersey 现在使用它来设置自定义注入提供程序。效果很好,但我想为本章的其余部分寻求帮助:

如何设置自定义注入注释?

目前,我现有的自定义注入解析器类(完全按照文档)编译得很好。我不确定他们是否应该继续直接实施org.glassfish.hk2.api.InjectionResolver?在 javadocs 中,我找到了InjectionResolverWrapper,我需要扩展它吗?

真正的问题是如何将注入解析器绑定到自定义注入。这不编译:

            bind(SessionInjectResolver.class)
                .to(new TypeLiteral<InjectionResolver<SessionInject>>(){})
                .in(Singleton.class);
Run Code Online (Sandbox Code Playgroud)

我非常感谢如何使用自定义注释进行注入再次在 Jersey 2.26 上工作的示例。

java dependency-injection jersey

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

远程 jmeter-server 将所有输出发送到控制 jmeter 实例

我的工作场所通过有线互联网连接,上行/下行有限,因此为了对 Web 应用程序进行负载测试,我使用分布式方法:

  • jmeter-server (v2.4) 的实例正在具有正确互联网连接的远程 Linux 机器上运行。
  • 控制 jmeter GUI(也是 2.4)正在我的桌面上运行。
  • 两者通过 VPN 连接。
  • SUT 是托管在另一个数据中心的 Web 应用程序。

这工作正常 - 我能够从 jmeter GUI 启动远程线程执行并在摘要报告中接收实时结果。

奇怪的是,我在 SUT 上施加实际负载的能力受到本地互联网连接(入站、下游)的限制。跟踪本地 jmeter GUI 和远程 jmeter-server 之间的链接,我可以看到从 SUT 到 jmeter-server 的所有 HTTP 流量都发送到本地 jmeter GUI。因此,如果 jmeter-server 从 SUT 检索 1MB 文件,则会将其发送到我的本地 jmeter GUI(通过我的慢速互联网链接)。

事情应该是这样吗?我预计只会传输关键的测量结果(成功、延迟等)。

[PS:我知道我可以将我的测试计划 scp 到远程盒子并在无头 jmeter 中运行它。但后来我没有看到实时结果......]

distributed jmeter load-testing

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

JSF2:selectOneMenu with custom selectItems:选中所有项目

感谢这里的一些很棒的文章,我已经能够<h:selectOneMenu />使用包含对象的selectItems 构建一个.在提供自定义FacesConverter并修复缺少的equals()/ hashcode()方法之后,我可以使用它来更改辅助bean的属性并将其写入数据库.

唯一奇怪的是 - 元素的所有 HTML 元素都是!换句话说:不反映绑定属性的当前值!<option /><select />checked="checked"<h:selectOneMenu />

细节:

Store.java

@Entity
public class Store {
  private Long id;
  private String name;

  @ManyToOne
  private Category category;

  // getters, setters, equals, hashcode
}
Run Code Online (Sandbox Code Playgroud)

Category.java

@Entity
public class Category {
  private Long id;
  private String name;

  // getters, setters, equals, hashcode
}
Run Code Online (Sandbox Code Playgroud)

editStore.xhtml

<h:form>
....
  <h:selectOneMenu value="#{backingBean.store.category}" id="category">
    <f:selectItems value="#{backingBean.categorySelectItems}" />
  </h:selectOneMenu>
....
</h:form>
Run Code Online (Sandbox Code Playgroud)

BackingBean.java

public class BackingBean {
  private Store store; …
Run Code Online (Sandbox Code Playgroud)

java jsf jsf-2

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

何时使用MessageDigest.reset()

我盲目地遵循了OWASP关于java中哈希生成的建议(见这里),我不确定我是否已经正确地完成了它.具体来说,我不确定其用途和效果MessageDigest.reset(),以及何时以及如何使用它.

  1. 我正在通过update()摘要多次使用不同的值来"加载"我的盐和有效负载,这些值完全需要签名.我应该reset()事先消化吗?还是之后呢?
  2. 为什么摘要reset()在循环内(参见示例)?

这是我的代码:

MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update(salt);
md.update(payload1);  // part 1 of payload
md.update(payload2);  // part 2 of payload
md.update(serialNumber);  // part 3 of payload
md.reset();
byte[] sig = md.digest();
for (int i=0; i<1000; i++) {
  md.reset();
  sig = md.digest(sig);
}
Run Code Online (Sandbox Code Playgroud)

我所观察到的是即使在serialNumber变化时签名仍然保持不变.如果我省略'reset()'调用,sig确实会改变...

java hash owasp message-digest

2
推荐指数
2
解决办法
5628
查看次数