Jakarta ee 在JAX-RS中使用@stateless在JavaEE6及更高版本中有什么好处?

Jakarta ee 在JAX-RS中使用@stateless在JavaEE6及更高版本中有什么好处?,jakarta-ee,jboss,ejb,jax-rs,java-ee-6,Jakarta Ee,Jboss,Ejb,Jax Rs,Java Ee 6,我将介绍使用JavaEE6的JBoss的可用功能 下面是我在本教程中找到的几个REST服务类 @Path("/media") public class MediaService { @Inject private MediaManager mediaManager; @Inject EntityManager entityManager; @GET @Path("/cache/{cachedFileName:\\S*}") @Produces

我将介绍使用JavaEE6的JBoss的可用功能

下面是我在本教程中找到的几个REST服务类

@Path("/media")
public class MediaService {

    @Inject
    private MediaManager mediaManager;

    @Inject EntityManager entityManager;

    @GET
    @Path("/cache/{cachedFileName:\\S*}")
    @Produces("*/*")
    public File getCachedMediaContent(@PathParam("cachedFileName") String cachedFileName) {
        return mediaManager.getCachedFile(cachedFileName);
    }

    @GET
    @Path("/{id:\\d*}")
    @Produces("*/*")
    public File getMediaContent(@PathParam("id") Long id) {
        return mediaManager.getCachedFile(mediaManager.getPath(entityManager.find(MediaItem.class, id)).getUrl());
    }
}

@Path("/metrics")
@Stateless
public class MetricsService {

    @Inject
    private EntityManager entityManager;

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public List<ShowMetric> getMetrics() {
        return retrieveMetricsFromShows(retrieveShows(),
            retrieveOccupiedCounts());
    }

    private List<ShowMetric> retrieveMetricsFromShows(List<Show> shows,
        Map<Long, Long> occupiedCounts) {
        List<ShowMetric> metrics = new ArrayList<ShowMetric>();
        for (Show show : shows) {
            metrics.add(new ShowMetric(show, occupiedCounts));
        }
        return metrics;
    }

    private List<Show> retrieveShows() {
        TypedQuery<Show> showQuery = entityManager
            .createQuery("select DISTINCT s from Show s JOIN s.performances p WHERE p.date > current_timestamp", Show.class);
        return showQuery.getResultList();
    }

    private Map<Long, Long> retrieveOccupiedCounts() {
        Map<Long, Long> occupiedCounts = new HashMap<Long, Long>();

        Query occupiedCountsQuery = entityManager
            .createQuery("select b.performance.id, SIZE(b.tickets) from Booking b "
                + "WHERE b.performance.date > current_timestamp GROUP BY b.performance.id");

        List<Object[]> results = occupiedCountsQuery.getResultList();
        for (Object[] result : results) {
            occupiedCounts.put((Long) result[0],
                ((Integer) result[1]).longValue());
        }

        return occupiedCounts;
    }
}
我的问题是为什么@stateless没有在MediaService类中使用,而是在MetricsService类中使用。但MetricsService类的优势在于它可以作为EJB注入,因为它带有@Stateless注释。但我浏览了整个应用程序代码,看看是否注入了MetricsService,但从未注入

请告诉我为什么作者在其中一个中使用@Stateless,而在另一个中不使用@Stateless。
源代码就在这里。

Brain,我假设开发人员不是不知道自己在做什么,就是缺少了一些功能。 我还检查了MetricService仅用于分析业务案例的性能指标的代码。因为它是一个简单的REST服务,@Stateless在这种情况下是无用的

在jboss/wildfly的一些早期JavaEE6版本中,EntityManager的注入在REST服务上是不可能的。你必须注射EMFactory。 所以我假设这要么是由于提到的,而不是完成的特性,要么是对EntityManager注入解决方案的一些旧引用


只有在REST服务上需要EJB功能(如Java EE安全性)时才需要@Stateless。

如果希望容器管理的事务正确无误,也需要@Stateless?好的。检查了规范,但似乎没有完全明确说明。我总是尝试使用EJB访问数据库。因为我总是尝试使用容器的CMT。因此,我的REST模型/DTO类只是将数据传递给我的EJB,EJB处理实体并读取/持久化实体。这可能对你的最后一个问题有所帮助:因此,从文章中可以看出,这与我上一篇评论相反,即使我目前使用Java EE 5创建REST/DTO模型。因为我们正在迁移到Java EE 6,它能够在REST层进行CDI,所以我们希望从中获益。@peeskillet:Java EE 6不需要@Stateless。在这两种情况下,您都会得到容器管理的事务。那么,无论是只读还是读写EJB操作,您为什么需要它呢。。