weblogic 12.2.1.1.0 中的“WELD-001409 类型依赖不明确”
" WELD-001409 Ambiguous dependencies for type " in weblogic 12.2.1.1.0
我在 weblogic 12.2.1.1.0 中遇到焊接和 CDI 问题,我有一个 class 名称和代码:
package bo.otracosa;
import java.lang.annotation.Retention;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.util.HashSet;
import java.util.Set;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.inject.Default;
import javax.enterprise.inject.Produces;
import javax.inject.Qualifier;
import javax.enterprise.inject.Produces;
/**
*
* @author jdlee
*/
@ApplicationScoped
public class Database {
public Database() {
}
private Set<String> authCodes = new HashSet();
private Set<String> tokens = new HashSet();
public void addAuthCode(String authCode) {
authCodes.add(authCode);
}
public boolean isValidAuthCode(String authCode) {
return authCodes.contains(authCode);
}
public void addToken(String token) {
tokens.add(token);
}
public boolean isValidToken(String token) {
return tokens.contains(token);
}
}
我想用 jerset jax-rs 注入 REST 服务,但在 REST 中我得到了这个错误:
:org.jboss.weld.exceptions.DeploymentException:WELD-001409: Ambiguous dependencies for type Database with qualifiers @Default
at injection point [BackedAnnotatedField] @Inject public bo.sigep.modulo.api.submodulo.AuthzEndPoint.db
at bo.sigep.modulo.api.submodulo.AuthzEndPoint.db(AuthzEndPoint.java:0)
Possible dependencies:
- Managed Bean [class bo.otracosa.Database] with qualifiers [@Any @Default],
- Managed Bean [class bo.otracosa.Database] with qualifiers [@Any @Default]
我在其他 post 中发现了这个错误,但在我的情况下,如何在 lib 或 classpath 中找到重复的 class 的解决方案不正确。
其他解决方案说用户 glashfish 但我使用 weblogic
注入是:
/**
*
* @author dddd
*/
import bo.otracosa.Database;
import bo.otracosa.Otraclase;
import java.net.URI;
import java.net.URISyntaxException;
import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.apache.oltu.oauth2.as.issuer.MD5Generator;
import org.apache.oltu.oauth2.as.issuer.OAuthIssuerImpl;
import org.apache.oltu.oauth2.as.request.OAuthAuthzRequest;
import org.apache.oltu.oauth2.as.response.OAuthASResponse;
import org.apache.oltu.oauth2.common.OAuth;
import org.apache.oltu.oauth2.common.exception.OAuthProblemException;
import org.apache.oltu.oauth2.common.exception.OAuthSystemException;
import org.apache.oltu.oauth2.common.message.OAuthResponse;
import org.apache.oltu.oauth2.common.message.types.ResponseType;
import org.apache.oltu.oauth2.common.utils.OAuthUtils;
/**
*
* @author jdlee
*/
@Path("/authz")
public class AuthzEndPoint {
@Inject
public Database db;
@GET
public String getMethod() {
db.isValidToken("hola");
return "ok";
}
}
不知道怎么办??
错误告诉我们,CDI 在 class 路径上找到 bo.otracosa.Database
class 两次。因此,包含此 class 的库 (jar) 被部署了不止一次。很难说,但常见的原因是:
- 您可能在部署中添加了两次 jar(可能是 maven 依赖版本问题)
- 包含
bo.otracosa.Database
的库可能已经与另一个应用程序或模块一起部署(如果使用 Maven 构建:将服务器上已有库的依赖范围更改为 provided
)
我更新了 weblogic 12.2.1.2 并且可以正常工作,但出现此错误:
Caused By: org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at SystemInjecteeImpl(requiredType=Database,parent=AuthzEndPoint,qualifiers={},position=-1,optional=false,self=false,unqualified=null,1091065126)
at org.jvnet.hk2.internal.ThreeThirtyResolver.resolve(ThreeThirtyResolver.java:75)
at org.jvnet.hk2.internal.Utilities.justInject(Utilities.java:941)
at org.jvnet.hk2.internal.ServiceLocatorImpl.inject(ServiceLocatorImpl.java:980)
at org.glassfish.jersey.ext.cdi1x.internal.AbstractCdiBeanHk2Factory.getInstance(AbstractCdiBeanHk2Factory.java:142)
at org.glassfish.jersey.ext.cdi1x.internal.AbstractCdiBeanHk2Factory._provide(AbstractCdiBeanHk2Factory.java:91)
Truncated. see log file for complete stacktrace
但我通过更改 cdi 配置中的此属性修复了问题:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
bean-discovery-mode="all">
</beans>
终于开始工作了
我在 weblogic 12.2.1.1.0 中遇到焊接和 CDI 问题,我有一个 class 名称和代码:
package bo.otracosa;
import java.lang.annotation.Retention;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.util.HashSet;
import java.util.Set;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.inject.Default;
import javax.enterprise.inject.Produces;
import javax.inject.Qualifier;
import javax.enterprise.inject.Produces;
/**
*
* @author jdlee
*/
@ApplicationScoped
public class Database {
public Database() {
}
private Set<String> authCodes = new HashSet();
private Set<String> tokens = new HashSet();
public void addAuthCode(String authCode) {
authCodes.add(authCode);
}
public boolean isValidAuthCode(String authCode) {
return authCodes.contains(authCode);
}
public void addToken(String token) {
tokens.add(token);
}
public boolean isValidToken(String token) {
return tokens.contains(token);
}
}
我想用 jerset jax-rs 注入 REST 服务,但在 REST 中我得到了这个错误:
:org.jboss.weld.exceptions.DeploymentException:WELD-001409: Ambiguous dependencies for type Database with qualifiers @Default
at injection point [BackedAnnotatedField] @Inject public bo.sigep.modulo.api.submodulo.AuthzEndPoint.db
at bo.sigep.modulo.api.submodulo.AuthzEndPoint.db(AuthzEndPoint.java:0)
Possible dependencies:
- Managed Bean [class bo.otracosa.Database] with qualifiers [@Any @Default],
- Managed Bean [class bo.otracosa.Database] with qualifiers [@Any @Default]
我在其他 post 中发现了这个错误,但在我的情况下,如何在 lib 或 classpath 中找到重复的 class 的解决方案不正确。 其他解决方案说用户 glashfish 但我使用 weblogic
注入是:
/**
*
* @author dddd
*/
import bo.otracosa.Database;
import bo.otracosa.Otraclase;
import java.net.URI;
import java.net.URISyntaxException;
import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.apache.oltu.oauth2.as.issuer.MD5Generator;
import org.apache.oltu.oauth2.as.issuer.OAuthIssuerImpl;
import org.apache.oltu.oauth2.as.request.OAuthAuthzRequest;
import org.apache.oltu.oauth2.as.response.OAuthASResponse;
import org.apache.oltu.oauth2.common.OAuth;
import org.apache.oltu.oauth2.common.exception.OAuthProblemException;
import org.apache.oltu.oauth2.common.exception.OAuthSystemException;
import org.apache.oltu.oauth2.common.message.OAuthResponse;
import org.apache.oltu.oauth2.common.message.types.ResponseType;
import org.apache.oltu.oauth2.common.utils.OAuthUtils;
/**
*
* @author jdlee
*/
@Path("/authz")
public class AuthzEndPoint {
@Inject
public Database db;
@GET
public String getMethod() {
db.isValidToken("hola");
return "ok";
}
}
不知道怎么办??
错误告诉我们,CDI 在 class 路径上找到 bo.otracosa.Database
class 两次。因此,包含此 class 的库 (jar) 被部署了不止一次。很难说,但常见的原因是:
- 您可能在部署中添加了两次 jar(可能是 maven 依赖版本问题)
- 包含
bo.otracosa.Database
的库可能已经与另一个应用程序或模块一起部署(如果使用 Maven 构建:将服务器上已有库的依赖范围更改为provided
)
我更新了 weblogic 12.2.1.2 并且可以正常工作,但出现此错误:
Caused By: org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at SystemInjecteeImpl(requiredType=Database,parent=AuthzEndPoint,qualifiers={},position=-1,optional=false,self=false,unqualified=null,1091065126)
at org.jvnet.hk2.internal.ThreeThirtyResolver.resolve(ThreeThirtyResolver.java:75)
at org.jvnet.hk2.internal.Utilities.justInject(Utilities.java:941)
at org.jvnet.hk2.internal.ServiceLocatorImpl.inject(ServiceLocatorImpl.java:980)
at org.glassfish.jersey.ext.cdi1x.internal.AbstractCdiBeanHk2Factory.getInstance(AbstractCdiBeanHk2Factory.java:142)
at org.glassfish.jersey.ext.cdi1x.internal.AbstractCdiBeanHk2Factory._provide(AbstractCdiBeanHk2Factory.java:91)
Truncated. see log file for complete stacktrace
但我通过更改 cdi 配置中的此属性修复了问题:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
bean-discovery-mode="all">
</beans>
终于开始工作了