问题标签 [guice-servlet]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
hibernate - 使用 Warp-Persist 升级 Guice 的依赖问题
我们有一个使用带有 warp-servlet 和 warp-persist 的 Guice 1.0 的应用程序,我们想升级到 Guice 2 或 3。但是,我们遇到了一个复杂的依赖关系网络。
有谁知道一种简单的方法(尽可能接近直接替换)使经纱持久与较新的 Guice 一起工作,或者使 Guice-persist 与直接的 Hibernate 一起工作?
- Warp-persist 需要 warp-servlet
- Warp-servlet 和 warp-persist 仅支持 Guice 1.0
- Guice-persist 似乎是 warp-persist 的替代品,但它只支持 JPA,而我们直接使用 Hibernate(有大量基于标准的代码遗留下来,这使得移植到 JPA 变得不简单)。
- Guice-persist 还声称有一种支持非 JPA 数据访问的方法,但似乎没有任何关于此的文档。
- Warp-persist 似乎不支持 Hibernate 4,所以我们也无法升级 Hibernate。
java - Guice Provider vs EntityManager
I was trying to get simple webapp working with Guice and JPA on Jetty, using the persistence and servlet guice extensions.
I have written this Service implementation class:
}
And this is my servlet (annotated with @Singleton):
When I run this it works, and I get the name sent to the client, but when I look at the log I see that there is no DML generated for the insertion and selection from postgresql does not return any results, which means it wasn't really persisted.
I debugged through the code and I saw that JpaLocalTxnInterceptor
called txn.commit()
.
Then I made a change to PersonServiceImpl
and used Provider<EntityManager>
instead of just EntityManager
and it worked as expected. Now I don't really understand why and it's probably because I don't really understand the idea behind Provider.
On the Guice wiki page it says:
Note that if you make MyService a @Singleton, then you should inject Provider instead.
However, my PersonServiceImpl is not a @Singleton so I am not sure why it applies, perhaps it's because of the Servlet?
I would really appreciate if you could clear this out for me.
junit - 在我的 JUnit 测试中,Guice 的 ServletModule 没有过滤 Jersey 端点上的请求
问题
我正在使用 Jersey 开发 RESTful API。为了允许在我的单元测试中模拟对象,我使用了依赖注入框架 Guice(特别是 Guice-Servlet)。可以通过您自己的过滤器实现过滤请求,方法是覆盖您的 ServletModule 的 configureServlet() 方法并添加:
在 Tomcat 中运行我的 webapp 时,我的请求通过这个 MyFilter 类正确过滤。但是,在我的 JUnit 测试中,我的任何请求都没有通过它过滤。任何人都可以帮我找到问题吗?
例子
- web / WEB-INF / web.xml:由 Tomcat 使用。将 ApplicationSetup 定义为路径“/api/*”上的 GuiceFilter。
- src/main/java/ApplicationSetup.java:为生产环境(Tomcat webserver)创建Guice Injector。使用 ApplicationModule 作为其 ServletModule 之一。
- src / main / java / ApplicationModule.java:ServletModule 配置和绑定路径'/api/*' 上的MyFilter 和Jersey 端点。
- src / main / java / endpoints / HelloWorldEndPoint.java:路径'/api/helloworld'的简单端点,带有GET请求方法。
- src / main / java / MyFilter.java:如果请求通过此过滤器,则在响应上设置“Via”标头。
- src/test/java/TestApplicationSetup.java:为测试环境(Grizzly webserver)创建Guice Injector。与 ApplicationSetup 一样,它也使用 ApplicationModule 作为其 ServletModules 之一。此外,它还有一种方法可以启动 Grizzly 网络服务器以进行测试。
- src / test / java / TestHelloWorldEndPoint.java:在 /api/helloworld 上执行 GET 请求,并检查响应是否将“Via”标头设置为 MyFilter。这失败了。
这里的重点是ApplicationModule,两个环境都使用它来绑定过滤器。如果您检查示例的日志记录,您会注意到 MyFilter 在两种环境中都已初始化(在 init() 方法中进行简单打印)。您还会注意到 ApplicationModule 用于两种环境中的 servlet 配置。但不知何故,Grizzly 网络服务器忽略了过滤器。
我已经为这个问题苦苦挣扎了很长一段时间,因此现在花时间在这里问这个问题。我真的希望有人可以帮助我解决这个问题。解决方法也受到赞赏。
servlets - Jersey & Guice:如何为每个 ServletModule 指定基本路径?
问题(s):
- 如何定义 Jersey 资源和
ExceptionMapper
s,使其仅响应对特定路径子集的请求? - 我怎样才能做到这一点,而不必提前决定以后要在什么基本路径下托管它们?
- 如何做到这一点,以便我可以
war
通过组合库创建单个库,每个库都为 Web 应用程序的特定基本路径定义资源?
背景:
我有一个 Guice + Jersey v1 webapp,它ServletModule
从两个不同的依赖项(jar
s)加载两个 s。
其中一个定义了其他 API 端点的资源(例如@Path("/purchases")
, @Path("/payment-methods")
),另一个定义了 Web UI 的资源(例如@Path("/")
, @Path("/products")
)。前者尝试将其 Jersey 资源绑定到
基本路径 ( ),
而后者对基本路径 ( ) 进行等效的操作。API以 JSON 错误对象响应,而 Web UI在 Freemarker 的帮助下生成 HTML 响应。ServletModule
"/api/"
serve("/api/*").with(GuiceContainer.class, conf);
"/"
serve("/*").with(GuiceContainer.class, conf);
ExceptionMapper
ExceptionMapper
ExceptionMapper
然而,这种组合的结果——API 和 Web UI jar 都在类路径上——是来自两个依赖项的 Jersey 资源响应具有以“/api/”和“/”开头的路径的请求。
例如,用于/purchases
响应 和 的请求http://example.com/api/purchases
的 http://example.com/purchases
API 资源。同样,Web UI 资源响应和/products
的请求。http://example.com/products
http://example.com/api/products
Jersey 看到两个ExceptionMapper
s 表示相同的异常类型(例如NotFoundException
)这一事实使它只选择一个,而不管请求的路径以什么开头。就我而言,和ExceptionMapper<NotFoundException>
下都响应未知资源请求,这对应用程序的任何部分都不利。/api/
/
java - 使用 Guice Servlet 测试项目:如何绑定超出范围的 RequestScoped 实例?
我们有一个使用 Guice 和 Guice Servlet 扩展实例化的 Java Web 应用程序。该应用程序还包括由 Guice 实例化的 Quartz 作业。我想为这些工作编写单元测试。
作业类依赖于我们生产代码中的其他其他类,这些类需要Provider<HttpServletRequest>
. 在生产设置中,Guice 可以成功实例化作业,并且作业按预期工作,因为它们从不调用其协作者上的任何代码,这些代码会触发get
servlet 请求提供者上的 a。这样的get
调用会失败,因为作业是由某个工作线程执行的,而不是作为对 servlet 的 HTTP 请求的一部分。
现在我的问题是如何在 JUnit 测试中设置 Guice,以便获得相同的行为,即可以实例化作业类,但所有使用范围外@RequestScoped
对象的尝试都会失败。
有两种简单的解决方案,但它们对我不起作用。
如果我不绑定任何HttpServletRequest
,则在尝试在测试设置中实例化作业时会出现错误:
另一方面,如果我只是绑定模拟实例,例如
然后可以实例化作业,但是如果作业使用 servlet 请求实例,我将不再收到测试错误。那么如何创建绑定以便 Guice 能够实例化提供程序,但对提供程序的任何使用都会失败?
java - 在 HTML 文件中显示汉字
我们有一个 servlet 程序,它使用 servlet 程序中的 HTML 代码,即
我在调试代码时从属性文件中获取汉字。但是一旦响应发送到页面,在 html 页面中我们会得到问号?????。
我们对英文字符没有任何问题,并且它们显示正确。
guice - Google guice 的实施不起作用
我是 Google guice 的初学者。我已经像下面这样编写了插入 Oracle 和 postgres db 的程序,我在这里发布了一个非常简单的 coede 但是,当我运行它时,我收到一个错误
线程“主”com.google.inject.ConfigurationException 中的异常:Guice 配置错误:
1) 没有绑定 com.googleguice.contract.ConsumerContract 的实现。同时定位 com.googleguice.contract.ConsumerContract
在 com.google.inject.internal.InjectorImpl.getProvider(InjectorImpl.java:961) 在 com.google.inject.inject.internal.InjectorImpl 的 com.google.inject.internal.InjectorImpl.getProvider(InjectorImpl.java:1004) 1 错误.getInstance(InjectorImpl.java:1013) 在 com.googleguice.client.ClientClass.main(ClientClass.java:15)
}
请帮助解决它。谢谢
java - 根据请求域(虚拟主机)嵌入码头和 guice 处理程序 servlet
详细地说,我通过 java 嵌入使用一个单一的码头服务器来处理多个请求。我正在用 guice 注入事件侦听器和安全过滤器。但是我需要根据请求域来服务器 servlet。我正在尝试使用虚拟主机,但由于我没有使用基于 xml 的配置,因此没有太多文档可以获取帮助。
所以我正在尝试的是-
如果域 abc -> 处理程序 AHandler 和过滤器应用了 AFilter,
如果域 bbc -> 处理程序 BHandler 和过滤器应用了 BFilter。
我的 Context 初始化是这样的:
监听类
安全模块:
在服务器中是这样的:
AServlet 和 BServlet 是带有 get post put 方法的常规 servlet。
但是我的实施没有按预期工作。它将所有请求发送到最后注册的处理程序。
需要一些帮助来完成我所需要的。我在哪里做错了?
mapreduce - HBase MapReduce 与 google.inject 不匹配
我正在尝试使用我们使用 Guice 4.0 的内部框架对 HBase 表进行地图缩减
看起来 yarn 可能正在使用 3.0 版,而我遇到了类型不匹配。
2016-03-25 08:19:45,784 ERROR [main] org.apache.hadoop.mapred.YarnChild: Error running child : java.lang.NoSuchMethodError: com.google.inject.multibindings.MultibindingsScanner$1.binder()Lcom/shaded/google/inject/Binder;
at com.google.inject.multibindings.MultibindingsScanner$1.configure(MultibindingsScanner.java:53)
at com.google.inject.AbstractModule.configure(AbstractModule.java:59)
at com.google.inject.spi.Elements$RecordingBinder.install(Elements.java:223)
at com.google.inject.AbstractModule.install(AbstractModule.java:118)
at my.packagename.client.KafkaModule.configure(KafkaModule.java:36)
at com.google.inject.AbstractModule.configure(AbstractModule.java:59)
at com.google.inject.spi.Elements$RecordingBinder.install(Elements.java:223)
at com.google.inject.spi.Elements.getElements(Elements.java:101)
at com.google.inject.internal.InjectorShell$Builder.build(InjectorShell.java:133)
at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:103)
at com.google.inject.Guice.createInjector(Guice.java:95)
at com.google.inject.Guice.createInjector(Guice.java:72)
at com.google.inject.Guice.createInjector(Guice.java:62)
at my.packagename.hbase_fix.CleanerMapper.setup(CleanerMapper.java:82)
at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:143)
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:787)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:341)
at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:164)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:422)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1657)
at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158)
在同一项工作中,我与 fastxml 有类似的不匹配,因此使用maven-shade-plugin
来成功重新定位,但我对 com.google.inject 并没有那么成功
<relocations>
<relocation>
<pattern>com.fasterxml</pattern>
<shadedPattern>com.shaded.fasterxml</shadedPattern>
<excludes>
<exclude>com.fasterxml.*</exclude>
</excludes>
</relocation>
<relocation>
<pattern>org.apache.commons.lang</pattern>
<shadedPattern>org.shaded.apache.commons.lang</shadedPattern>
<excludes>
<exclude>org.apache.commons.lang.*</exclude>
</excludes>
</relocation>
<relocation>
<pattern>com.google.inject.Binder</pattern>
<shadedPattern>com.shaded.google.inject.Binder</shadedPattern>
</relocation>
<relocation>
<pattern>com.google.inject.multibindings</pattern>
<shadedPattern>com.shaded.google.inject.multibindings</shadedPattern>
</relocation>
</relocations>
关于如何在 MapReduce 作业中特别使用 google.inject 获得圆形类型不匹配的任何建议?
java - Weblogic 12c:泽西岛的 Prefer-web-inf-classes 和 prefer-application-packages
我必须在Weblogic 12c 服务器(12.2.1)上同时使用(奇怪的是..)prefer-web-inf-classes
和weblogic.xmlprefer-application-packages
的 属性
它是基于 Jersey 1.9 的 REST 应用程序。(泽西岛 1.x JAX-RS RI)和 Guice。
1. 为什么使用 :prefer-web-inf-classes
如果您有多个 WAR,则必须将 guice-jersey / guice 的库放在 war/lib 级别,否则会出现Multibindings Error。
还必须指出prefer-web-inf-classes
to true
。
这样它就可以正常工作了!
我试图以同样的方式使用prefer-application-package
s 和包(com.sun.jersey.guice.spi.container.servlet
,com.google.inject.servlet
等...),但没有办法。
注意:不能在EAR级别排除此库。
2. 为什么使用 :prefer-application-packages
要在 Weblogic 12c (12.2.1) 上使用 Jersey 1.x JAX-RS RI,所以我必须指出以下包(Weblogic 使用 Jersey 2 的其他方式,以及不同版本的 Jackson 库等)
如果以这种方式指示,它可以在 Jersey 1.X 上完美运行。. 我已经分别探测了两场战争,并且工作正常......但是,记住我的朋友我有两场战争......所以......
概括
我不能同时使用这两个属性(在 weblogic.xml 上使用这两个属性时出现部署错误..),但它是必需的:
- 对于 Guice Filter 的问题,需要
prefer-web-inf-classes
使用true
/guice-servlet.jar
在jersey-guice.jar
war -lib 级别。 - 要使用 Jersey 1.x,需要使用.....
prefer-application-package
问题:如何将两者结合使用其中之一?