Java Can';t将*.war部署到Glassfish 4
我有一个Bean接口,AbstractBean(实现Bean)和SpecificBean(扩展AbstractBean)。我想通过以下代码片段注入SpecificBean:Java Can';t将*.war部署到Glassfish 4,java,jakarta-ee,dependency-injection,ejb,Java,Jakarta Ee,Dependency Injection,Ejb,我有一个Bean接口,AbstractBean(实现Bean)和SpecificBean(扩展AbstractBean)。我想通过以下代码片段注入SpecificBean: @Stateless @Specific public class SpecificBean extends AbstractBean {..} @Path("resource") public class Service { @Inject @Specific private Bean bean;
@Stateless
@Specific
public class SpecificBean extends AbstractBean {..}
@Path("resource")
public class Service {
@Inject
@Specific
private Bean bean;
}
当我尝试将其部署到glassfish时,我看到了下一个错误: 部署期间发生错误:加载应用程序时出现异常:CDI部署失败:WELD-001408在[BackedAnnotatedConstructor]的注入点[[BackedAnnotatedParameter]参数2处具有限定符[@Default]的类型[IterableProvider>]的未满足依赖项@Inject org.glassfish.jersey.internal.Inject.JerseyClassAnalyzer(@Named ClassAnalyzer,IterableProvider>)]
如果删除所有注释(预期为@Path),应用程序部署时不会出现任何错误。从maven pom.xml中的依赖项列表中删除了jersey(jersey已经包含在glassfish 4中),现在部署正常。我发现这个问题与类似,只想添加我的“2美分”。在我的例子中,我将Jersey 2.0与Jackson一起使用,以便从rest接口将JSON转换为对象,并将对象转换为JSON。这意味着我必须在
ResourceConfig
上注册JacksonFeature
,如下所示:
import org.glassfish.jersey.jackson.JacksonFeature;
import org.glassfish.jersey.message.GZipEncoder;
import org.glassfish.jersey.server.ResourceConfig;
public class JacksonRestConfiguration extends ResourceConfig {
public JacksonRestConfiguration() {
register( new GZipEncoder() );
register( JacksonFeature.class );
}
我还在我的应用程序扩展上禁用了Moxy:
import org.glassfish.jersey.CommonProperties;
@ApplicationPath("services")
public class RestApplication extends Application implements Feature {
public boolean configure( final FeatureContext context ) {
String postfix = '.' + context.getConfiguration().getRuntimeType().name().toLowerCase();
context.property( CommonProperties.MOXY_JSON_FEATURE_DISABLE + postfix, true );
return true;
}
}
上述两个类都要求我在我的pom.xml
中保留jersey作为提供的
,以便正确生成war文件:
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.13</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-server</artifactId>
<version>2.13</version>
<scope>provided</scope>
</dependency>
org.glassfish.jersey.media
泽西媒体公司
2.13
假如
org.glassfish.jersey.core
泽西服务器
2.13
假如
以下是帮助我解决此问题的一些步骤:
asadmin start-domain
asadmin set configs.config.server-config.cdi-service.enable-implicit-cdi=false
如果您使用CDI,它应该可以正常工作。如果不是,则将
@Inject
替换为@EJB(“”
),其中”
是特定bean实现的名称。当我尝试将其部署到glassfish时,我看到下一个错误:部署期间发生错误:加载应用程序时异常:CDI部署失败:WELD-001408[Ref]类型的未满足依赖项在[BackedAnnotatedConstructor]@Injector org.glassfish.jersey.server.internal.routing.UriRoutingContext(Ref,ProcessingProviders)]的注入点[[BackedAnnotatedParameter]参数1处使用限定符[@Default]。@LuiggiMendoza是,我使用CDI,但是在glassfish 4上部署war时会收到上述错误。请编辑您的问题并发布整个错误消息。@Specific
实际上是限定符吗?从错误日志中,您可以看到只有@Default
限定符应用于注入点。除了没有Maven之外,我也遇到了完全相同的问题,但听起来将范围更改为“提供”等同于在编译时包含JAR,而不是在部署时。通过我的工具(Ant)为我修复了它。谢谢你的2美分!