【发布时间】:2017-08-16 07:31:10
【问题描述】:
当我尝试用priority 试验CDI alternatives 时,它的工作方式相反,选择优先级最低的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>
Greeting.java
package org.bala.java.jee.cdi.alternatives.priority.entity;
public interface Greeting {
public String greet(final String greet);
}
FancyGreeting.java
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;
}
}
PriorityGreeting.java
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;
}
}
RegularGreeting.java
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;
}
}
AlternativesPriorityController.java
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);
}
}
AlternativesPriorityResource.java
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">
</beans>
【问题讨论】:
标签: jakarta-ee cdi