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),等等。对于大多数应用程序,它甚至是显式指定的。这允许在外部重写带注释的行为,而无需重建应用程序。如果实现者决定执行相反的操作,我会感到惊讶,因为这会使应用程序在外部无法配置。