在我的一个项目中,我已经将Jersey从版本升级2.14到2.23.但是我遇到了一个问题需要花费很多时间.我的项目ExceptionMapper为a 定义了自己的ValidationException,但不幸的是,Jersey已经为这个异常提供了一个内置的异常映射器,我无法覆盖它.
我已正确注册(我检查过)我自己的映射器,如下所示:
@Provider
public class ValidationExceptionMapper implements
ExceptionMapper<ValidationException> {
@Override
public Response toResponse(ValidationException exception) {
return Response.status(Status.BAD_REQUEST).build();
}
}
Run Code Online (Sandbox Code Playgroud)
但它永远不会被召唤.泽西总是拿起来org.glassfish.jersey.server.validation.internal.ValidationExceptionMapper.我也试过@Priority为我的自定义映射器使用 注释,但不幸的是Jersey没有考虑它.
那么发生了什么?它在以前的Jersey版本中运行得非常好,所以它似乎是一个回归错误.
我放弃.有线索吗?
来自Guice背景,我知道可以使用范围从范围中播种对象值.
scope.seed(Key.get(SomeObject.class), someObject);
Run Code Online (Sandbox Code Playgroud)
我想通过注册一个从a获取值的Bean可以做到这一点AbstractBoundContext,但是从自定义范围中播种一个值的示例似乎很难找到.如何创建一个自定义范围,该范围可以为可以注入其他位置的值提供种子?
编辑:
我目前正在使用以下解决方法,可以在拦截器中注入以设置Configuration何时进入范围,然后可以通过其线程本地提供程序注入.我仍然在寻找那些感觉不那么hacky /与Weld中的范围/范围上下文系统更加集成的选项.
@Singleton
public class ConfigurationProducer {
private final InheritableThreadLocal<Configuration> threadLocalConfiguration =
new InheritableThreadLocal<>();
@Produces
@ActiveDataSet
public ConfigurationConfiguration() {
return threadLocalConfiguration.get()
}
public void setConfiguration(Configuration configuration) {
threadLocalConfiguration.set(configuration);
}
}
Run Code Online (Sandbox Code Playgroud) 那里,
我对Java EE和CDI非常新鲜.我尝试设置一个测试项目,以便使用JAX-RS和CDI完成我的第一步.我通过提供beans.xml来启用CDI.只要我测试,我就使用bean-discovery-mode ="all"元素.CDI似乎工作正常,因为我可以成功地将BeanManager注入我的测试资源,并且我可以输出它发现的所有bean.
我尝试注入一个由producer方法提供的类.Netbeans向我显示了对provideMe字段的警告: 没有找到符合注入bean条件的资源
当我将应用程序部署到Glassfish时,我得到了焊接异常:
WELD-001408 Unsatisfied dependencies for type [ProvideMeInterface] with qualifiers [@Default] at injection point [[BackedAnnotatedField] @Inject private com.test.rest.DataImport.provideMe]
Run Code Online (Sandbox Code Playgroud)
这是我的这个小测试的类:
接口:
package com.test.orm;
public interface ProvideMeInterface
{
int getCount();
}
Run Code Online (Sandbox Code Playgroud)
执行:
package com.test.orm;
public class ProvideMeImpl implements ProvideMeInterface {
int cnt;
ProvideMeImpl(int cnt)
{
this.cnt = cnt;
}
@Override
public int getCount() {
return cnt;
}
}
Run Code Online (Sandbox Code Playgroud)
制片人:
package com.test.orm;
import javax.enterprise.context.ApplicationScoped;
import javax.ws.rs.Produces;
public class ProvideMeProvider {
@Produces
@ApplicationScoped
public ProvideMeInterface produceFactory() {
return new …Run Code Online (Sandbox Code Playgroud) 我有一个简单的测试应用程序,我将其部署到 GlassFish(只有一个资源注入了一个简单的类)。在 GlassFish 上,一切工作正常(除了记录 FINE 时的例外情况,请参阅此处)。我可以成功调用资源,并且 Weld CDI 正在执行注入。
现在,当我在 Java SE 中启动应用程序以使用 JUnit 进行单元测试时,HK2 似乎正在尝试提供注入,这会导致 UnsatisfiedDependencyException。
我可以定义一个 AbtractBinder 来绑定 InjectMe 类,以便 HK2 知道它。然后注射就可以正常工作了。但 Weld CDI 应该将该类注入 Jersey 资源,而不是 HK2。
引导是通过创建自定义 JUnit 运行程序 (WeldJUnit4Runner) 和@RunWith(WeldJUnit4Runner.class)注释来完成的,有关示例,请参见此处:http ://blog.rocketscience.io/dependency-injection-with-cdi-in-java-se/
Weld CDI 已成功引导到 Java SE 环境,我可以成功地将 InjectMe 类注入到实际的 JUnit 测试类中,而不是注入到 Jersey 资源中。InjectMe 类是通过 Weld 引导发现的:
2014-07-16 10:41:12,730 [DEBUG] org.jboss.weld.Bootstrap - WELD-000106: Bean: Managed Bean [class com.test.rest.InjectMe] with qualifiers [@Any @Default]
Run Code Online (Sandbox Code Playgroud)
问题:在 Java SE 中运行时,为什么 HK2 尝试注入 InjectMe 类而不是 Weld? …
使用有什么区别:
WeldContainer se = new Weld().initialize();
或者
SeContainer se = SeContainerInitializer.newInstance().initialize();
我只是想使用@Injection和@Produce注解,但是我还没有发现这两种初始化对象实例的方式之间的区别。
我有一个在Wildfly中运行的Web应用程序,它使用Spring和JPA.现在我将应用程序的登录模块作为JBoss中的自定义模块移动.
代码段如下.
public class MyLoginModule extends AbstractServerLoginModule
{
private Principal caller;
private char[] credential;
private String[] roleList;
@Inject
@DaoQualifier
private Dao dao;
@Override
public void initialize(Subject subject, CallbackHandler callbackHandler,
Map sharedState, Map options) {
super.initialize(subject, callbackHandler, sharedState, options);
super.principalClassName = "com.myapp.login.LoginPrincipal";
}
@Override
public boolean login() throws LoginException
{
logger.info("inside login "+dao);
if (super.login())
{
................
}
else
{
............
}
}
}
Run Code Online (Sandbox Code Playgroud)
DaoImpl类如下所示.
public class DaoImpl implements Dao {
@Inject
private EntityManager em;
//implementation methods
}
Run Code Online (Sandbox Code Playgroud)
Pom.xml依赖项
<dependencies> …Run Code Online (Sandbox Code Playgroud)