Jakarta ee 优先级不符合预期的CDI备选方案?可能的原因是什么?
当我尝试用Jakarta ee 优先级不符合预期的CDI备选方案?可能的原因是什么?,jakarta-ee,cdi,Jakarta Ee,Cdi,当我尝试用优先级对CDI备选方案进行实验时,结果是相反的,选择了优先级最低的bean,而不是优先级最高的bean。具有优先权的备选方案如何工作 beans.xml <?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:schemaLo
优先级
对CDI
备选方案进行实验时,结果是相反的,选择了优先级最低的bean,而不是优先级最高的bean。具有优先权的备选方案如何工作
beans.xml
<?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">
<alternatives>
<class>org.bala.java.jee.cdi.alternatives.priority.entity.RegularGreeting</class>
<class>org.bala.java.jee.cdi.alternatives.priority.entity.FancyGreeting</class>
<class>org.bala.java.jee.cdi.alternatives.priority.entity.PriorityGreeting</class>
</alternatives>
</beans>
<?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>
FancyGreeting.java
package org.bala.java.jee.cdi.alternatives.priority.entity;
public interface Greeting {
public String greet(final String greet);
}
package org.bala.java.jee.cdi.alternatives.priority.entity;
import javax.annotation.Priority;
import javax.enterprise.inject.Alternative;
import javax.interceptor.Interceptor;
@Alternative
@Priority(Interceptor.Priority.APPLICATION + 1)
public class FancyGreeting implements Greeting {
@Override
public String greet(String greet) {
return "schöner Tag, " + greet;
}
}
package org.bala.java.jee.cdi.alternatives.priority.entity;
import javax.annotation.Priority;
import javax.enterprise.inject.Alternative;
import javax.interceptor.Interceptor;
@Alternative
@Priority(Interceptor.Priority.APPLICATION + 2)
public class PriorityGreeting implements Greeting {
@Override
public String greet(String greet) {
return "der Vorrang, Hello, " + greet;
}
}
package org.bala.java.jee.cdi.alternatives.priority.entity;
import javax.annotation.Priority;
import javax.enterprise.inject.Alternative;
import javax.interceptor.Interceptor;
@Alternative
@Priority(Interceptor.Priority.APPLICATION)
public class RegularGreeting implements Greeting {
@Override
public String greet(String greet) {
return "hello " + greet;
}
}
package org.bala.java.jee.cdi.alternatives.priority.controller;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import org.bala.java.jee.cdi.alternatives.priority.entity.Greeting;
@ApplicationScoped
public class AlternativesPriorityController {
@Inject
Greeting greet;
public String getGreet(String string) {
return greet.greet(string);
}
}
package org.bala.java.jee.cdi.alternatives.priority.boundary;
import javax.inject.Inject;
import javax.json.Json;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.bala.java.jee.cdi.alternatives.priority.controller.AlternativesPriorityController;
@Path("/alternatives")
public class AlternativesPriorityResource {
@Inject
AlternativesPriorityController controller;
@Path("/priority")
@GET
public Response getGreet() {
return Response.ok(Json.createObjectBuilder().add("Greet", controller.getGreet("Princess !")).build(), MediaType.APPLICATION_JSON).build();
}
}
PriorityGreeting.java
package org.bala.java.jee.cdi.alternatives.priority.entity;
public interface Greeting {
public String greet(final String greet);
}
package org.bala.java.jee.cdi.alternatives.priority.entity;
import javax.annotation.Priority;
import javax.enterprise.inject.Alternative;
import javax.interceptor.Interceptor;
@Alternative
@Priority(Interceptor.Priority.APPLICATION + 1)
public class FancyGreeting implements Greeting {
@Override
public String greet(String greet) {
return "schöner Tag, " + greet;
}
}
package org.bala.java.jee.cdi.alternatives.priority.entity;
import javax.annotation.Priority;
import javax.enterprise.inject.Alternative;
import javax.interceptor.Interceptor;
@Alternative
@Priority(Interceptor.Priority.APPLICATION + 2)
public class PriorityGreeting implements Greeting {
@Override
public String greet(String greet) {
return "der Vorrang, Hello, " + greet;
}
}
package org.bala.java.jee.cdi.alternatives.priority.entity;
import javax.annotation.Priority;
import javax.enterprise.inject.Alternative;
import javax.interceptor.Interceptor;
@Alternative
@Priority(Interceptor.Priority.APPLICATION)
public class RegularGreeting implements Greeting {
@Override
public String greet(String greet) {
return "hello " + greet;
}
}
package org.bala.java.jee.cdi.alternatives.priority.controller;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import org.bala.java.jee.cdi.alternatives.priority.entity.Greeting;
@ApplicationScoped
public class AlternativesPriorityController {
@Inject
Greeting greet;
public String getGreet(String string) {
return greet.greet(string);
}
}
package org.bala.java.jee.cdi.alternatives.priority.boundary;
import javax.inject.Inject;
import javax.json.Json;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.bala.java.jee.cdi.alternatives.priority.controller.AlternativesPriorityController;
@Path("/alternatives")
public class AlternativesPriorityResource {
@Inject
AlternativesPriorityController controller;
@Path("/priority")
@GET
public Response getGreet() {
return Response.ok(Json.createObjectBuilder().add("Greet", controller.getGreet("Princess !")).build(), MediaType.APPLICATION_JSON).build();
}
}
RegularGreeting.java
package org.bala.java.jee.cdi.alternatives.priority.entity;
public interface Greeting {
public String greet(final String greet);
}
package org.bala.java.jee.cdi.alternatives.priority.entity;
import javax.annotation.Priority;
import javax.enterprise.inject.Alternative;
import javax.interceptor.Interceptor;
@Alternative
@Priority(Interceptor.Priority.APPLICATION + 1)
public class FancyGreeting implements Greeting {
@Override
public String greet(String greet) {
return "schöner Tag, " + greet;
}
}
package org.bala.java.jee.cdi.alternatives.priority.entity;
import javax.annotation.Priority;
import javax.enterprise.inject.Alternative;
import javax.interceptor.Interceptor;
@Alternative
@Priority(Interceptor.Priority.APPLICATION + 2)
public class PriorityGreeting implements Greeting {
@Override
public String greet(String greet) {
return "der Vorrang, Hello, " + greet;
}
}
package org.bala.java.jee.cdi.alternatives.priority.entity;
import javax.annotation.Priority;
import javax.enterprise.inject.Alternative;
import javax.interceptor.Interceptor;
@Alternative
@Priority(Interceptor.Priority.APPLICATION)
public class RegularGreeting implements Greeting {
@Override
public String greet(String greet) {
return "hello " + greet;
}
}
package org.bala.java.jee.cdi.alternatives.priority.controller;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import org.bala.java.jee.cdi.alternatives.priority.entity.Greeting;
@ApplicationScoped
public class AlternativesPriorityController {
@Inject
Greeting greet;
public String getGreet(String string) {
return greet.greet(string);
}
}
package org.bala.java.jee.cdi.alternatives.priority.boundary;
import javax.inject.Inject;
import javax.json.Json;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.bala.java.jee.cdi.alternatives.priority.controller.AlternativesPriorityController;
@Path("/alternatives")
public class AlternativesPriorityResource {
@Inject
AlternativesPriorityController controller;
@Path("/priority")
@GET
public Response getGreet() {
return Response.ok(Json.createObjectBuilder().add("Greet", controller.getGreet("Princess !")).build(), MediaType.APPLICATION_JSON).build();
}
}
AlternativesPriorityController.java
package org.bala.java.jee.cdi.alternatives.priority.entity;
public interface Greeting {
public String greet(final String greet);
}
package org.bala.java.jee.cdi.alternatives.priority.entity;
import javax.annotation.Priority;
import javax.enterprise.inject.Alternative;
import javax.interceptor.Interceptor;
@Alternative
@Priority(Interceptor.Priority.APPLICATION + 1)
public class FancyGreeting implements Greeting {
@Override
public String greet(String greet) {
return "schöner Tag, " + greet;
}
}
package org.bala.java.jee.cdi.alternatives.priority.entity;
import javax.annotation.Priority;
import javax.enterprise.inject.Alternative;
import javax.interceptor.Interceptor;
@Alternative
@Priority(Interceptor.Priority.APPLICATION + 2)
public class PriorityGreeting implements Greeting {
@Override
public String greet(String greet) {
return "der Vorrang, Hello, " + greet;
}
}
package org.bala.java.jee.cdi.alternatives.priority.entity;
import javax.annotation.Priority;
import javax.enterprise.inject.Alternative;
import javax.interceptor.Interceptor;
@Alternative
@Priority(Interceptor.Priority.APPLICATION)
public class RegularGreeting implements Greeting {
@Override
public String greet(String greet) {
return "hello " + greet;
}
}
package org.bala.java.jee.cdi.alternatives.priority.controller;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import org.bala.java.jee.cdi.alternatives.priority.entity.Greeting;
@ApplicationScoped
public class AlternativesPriorityController {
@Inject
Greeting greet;
public String getGreet(String string) {
return greet.greet(string);
}
}
package org.bala.java.jee.cdi.alternatives.priority.boundary;
import javax.inject.Inject;
import javax.json.Json;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.bala.java.jee.cdi.alternatives.priority.controller.AlternativesPriorityController;
@Path("/alternatives")
public class AlternativesPriorityResource {
@Inject
AlternativesPriorityController controller;
@Path("/priority")
@GET
public Response getGreet() {
return Response.ok(Json.createObjectBuilder().add("Greet", controller.getGreet("Princess !")).build(), MediaType.APPLICATION_JSON).build();
}
}
AlternativesPriorityResource.java
package org.bala.java.jee.cdi.alternatives.priority.entity;
public interface Greeting {
public String greet(final String greet);
}
package org.bala.java.jee.cdi.alternatives.priority.entity;
import javax.annotation.Priority;
import javax.enterprise.inject.Alternative;
import javax.interceptor.Interceptor;
@Alternative
@Priority(Interceptor.Priority.APPLICATION + 1)
public class FancyGreeting implements Greeting {
@Override
public String greet(String greet) {
return "schöner Tag, " + greet;
}
}
package org.bala.java.jee.cdi.alternatives.priority.entity;
import javax.annotation.Priority;
import javax.enterprise.inject.Alternative;
import javax.interceptor.Interceptor;
@Alternative
@Priority(Interceptor.Priority.APPLICATION + 2)
public class PriorityGreeting implements Greeting {
@Override
public String greet(String greet) {
return "der Vorrang, Hello, " + greet;
}
}
package org.bala.java.jee.cdi.alternatives.priority.entity;
import javax.annotation.Priority;
import javax.enterprise.inject.Alternative;
import javax.interceptor.Interceptor;
@Alternative
@Priority(Interceptor.Priority.APPLICATION)
public class RegularGreeting implements Greeting {
@Override
public String greet(String greet) {
return "hello " + greet;
}
}
package org.bala.java.jee.cdi.alternatives.priority.controller;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import org.bala.java.jee.cdi.alternatives.priority.entity.Greeting;
@ApplicationScoped
public class AlternativesPriorityController {
@Inject
Greeting greet;
public String getGreet(String string) {
return greet.greet(string);
}
}
package org.bala.java.jee.cdi.alternatives.priority.boundary;
import javax.inject.Inject;
import javax.json.Json;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.bala.java.jee.cdi.alternatives.priority.controller.AlternativesPriorityController;
@Path("/alternatives")
public class AlternativesPriorityResource {
@Inject
AlternativesPriorityController controller;
@Path("/priority")
@GET
public Response getGreet() {
return Response.ok(Json.createObjectBuilder().add("Greet", controller.getGreet("Princess !")).build(), MediaType.APPLICATION_JSON).build();
}
}
产出:
{
"Greet": "hello Princess !"
}
但是期望的输出是
{
"Greet": "der Vorrang, Hello, Princess !"
}
谢谢
更新了@BalusC建议的beans.xml
beans.xml
<?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">
<alternatives>
<class>org.bala.java.jee.cdi.alternatives.priority.entity.RegularGreeting</class>
<class>org.bala.java.jee.cdi.alternatives.priority.entity.FancyGreeting</class>
<class>org.bala.java.jee.cdi.alternatives.priority.entity.PriorityGreeting</class>
</alternatives>
</beans>
<?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>
这是因为您也在
beans.xml
中注册了它们,其中RegularGreeting
排名最高。XML配置始终覆盖注释配置。换句话说,@备选方案
被完全忽略
只要从
beans.xml
中删除整个
部分,那么@Alternative
就可以与@Priority
一起完成它的工作。我试着从bean.xml
中删除整个alternatives
部分,但仍然选择了优先级最低的bean(常规问候语)而不是高优先级的bean(优先问候语)我正在使用Payara完整版本的4.1.2,经过一次干净的构建和重新部署,工作正常,虽然在Payara中启用了自动发布,但我必须在eclipse中以传统方式部署它。谢谢@BalusC@BalusC需要更正的是,XML配置并不总是覆盖优先级注释。事实上,这是规范未定义的,由implementati决定在上。您观察到的是特定于焊缝的行为。@Siliarus:任何其他可注释的Java EE容器管理工件都可以通过某个XML文件覆盖,比如CDI管理的bean(beans.XML)、JSF工件(faces config.XML)、JPA实体(orm.XML)、EJB拦截器(EJB.XML)、WebServlets/Filters/Listeners(web.XML),等等。对于大多数应用程序,它甚至是显式指定的。这允许在外部重写带注释的行为,而无需重建应用程序。如果实现者决定执行相反的操作,我会感到惊讶,因为这会使应用程序在外部无法配置。