当前位置: 首页 > 知识库问答 >
问题:

在雅加达EE哪里放@stateless注释?

於宏大
2023-03-14

这个项目当然也有控制器调用的服务。因为它是一个Spring项目,所以用@Service注释对它们进行了注释。

当然,现在我想知道如何将这一点转移到雅加达世界。

用@stateless(我不需要@statelable)注释它的唯一方法是吗?

如果我使用@stateless,我必须把它放在实现类的接口上吗?或者,如果我把它放在接口上,它会被实现类继承吗?

共有1个答案

欧阳永宁
2023-03-14

这比您要求的要多一点,但我认为最好是布局更大的画面,而不是说在这里是添加@stateless注释的地方。

服务实现实际上并不需要接口。

在这种方法中,接口被一个具有实际公共实现的抽象服务类所取代。孩子只是继承和实施特定的行为。它本质上提供了相同的抽象,但更少的样板。

随便换吧。

package your.model.base.visibility;

import jakarta.json.bind.config.PropertyVisibilityStrategy;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class PublicVisibilityStrategy implements PropertyVisibilityStrategy {

    @Override
    public boolean isVisible(Field field) {
        return true;
    }

    @Override
    public boolean isVisible(Method method) {
        return true;
    }
}

持久实体

甚至在持久性之前就给每个实体一个id,以确保相等性检查。

package your.model.base;

import jakarta.json.bind.annotation.JsonbTransient;
import jakarta.json.bind.annotation.JsonbVisibility;
import jakarta.persistence.Column;
import jakarta.persistence.Id;
import jakarta.persistence.MappedSuperclass;
import your.model.base.visibility.PublicVisibilityStrategy;

import java.io.Serializable;
import java.util.Objects;
import java.util.UUID;

@MappedSuperclass
@JsonbVisibility(value = PublicVisibilityStrategy.class)
public abstract class PersistentEntity implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    protected UUID id = UUID.randomUUID();

    @Column
    @JsonbTransient
    protected Integer version;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        PersistentEntity that = (PersistentEntity) o;
        if (id == null) return false;
        return id.equals(that.id);
    }

    @Override
    public int hashCode() {
        if (id == null) {
            return super.hashCode();
        }
        return Objects.hash(id);
    }

    @Override
    public String toString() {
        return "PersistentEntity { id=" + id + " }";
    }

    public UUID getId() {
        return id;
    }

    public void setId(UUID id) {
        this.id = id;
    }

    public Integer getVersion() {
        return version;
    }

    public void setVersion(Integer version) {
        this.version = version;
    }
}
package your.model;

import jakarta.persistence.Entity;
import your.model.base.PersistentEntity;

@Entity
public class Person extends PersistentEntity {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
package your.api.service;

import your.model.base.PersistentEntity;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import java.util.List;

public abstract class BaseService<T extends PersistentEntity> {

    private Class<T> type;

    @PersistenceContext
    private EntityManager em;

    public List<T> findAll() {

        // Just an example, make sure to include a where clause

        String statement = String.format("from %s", type.getSimpleName());
        return em.createQuery(statement).getResultList();
    }
}

个性化服务

这就是@stateless注释的位置。

它由应用服务器根据请求创建、使用和丢弃。

package your.api.service;

import jakarta.ejb.Stateless;
import your.model.Person;

@Stateless
public class PersonService extends BaseService<Person> {

    /** Custom Person methods/queries go here. */
}
package your.api.resource;

import jakarta.inject.Inject;
import jakarta.inject.Named;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response;
import your.api.service.PersonService;
import your.model.Person;

import java.util.List;

@Named
@Produces(MediaType.APPLICATION_JSON)
public class PersonResource {

    @Inject
    private PersonService service;

    @GET
    @Path("/")
    public Response listAll() {
        List<Person> all = service.findAll();
        return Response.ok(all).build();
    }
}
 类似资料:
  • 问题内容: hibernate注释应该放在哪里? 它是我的实例变量上方的线吗?还是在吸气剂之前?还是在二传手之前?还是真的不重要吗? 非常感谢 问题答案: 您可以将它们放在 野外 或 吸气剂上 。从《 Hibernate注释参考指南》中: 2.2.1。将POJO标记为持久实体 (…) 根据您是否注释字段或方法,Hibernate使用的访问类型将是字段或属性。EJB3规范要求您在将要访问的元素类型上

  • 问题内容: 休眠注释应该放在哪里? 它是我的实例变量上方的线吗?还是在吸气剂之前?还是在二传手之前?还是真的不重要吗? 非常感谢 问题答案: 您可以将它们放在 野外 或 吸气剂上 。从《 Hibernate注释参考指南》中: 2.2.1。将POJO标记为持久实体 (…) 根据您是否注释字段或方法,Hibernate使用的访问类型将是字段或属性。EJB3规范要求您在将要访问的元素类型上声明注释,即,

  • 我怀疑Spring注释放在哪一层?以下是两种情况: > case:将放置在DAO层中 案例:将放置在服务层中? 我只使用Spring,而不是SpringMVC。

  • 问题内容: 我的项目是这样的: 有人可以告诉我将hibernate.cfg.xml放在哪里吗? 因为出现此错误: 问题答案: 配置文件必须位于上。 根据您的项目,这可以通过不同的方式来完成。 对于 Web应用程序WAR 项目(您正在Servlet容器中运行程序):当应用程序在容器中运行时,将其放入将在类路径上可见的文件中起作用。 对于 Maven的 风格的项目(在Servlet容器没有运行该程序)

  • 问题内容: 你应该将放置在类和/或它们的方法中,还是更好地注释使用DAO对象调用的Service类?还是对两个“层”都进行注释是否有意义? 问题答案: 我认为交易属于服务层。这是了解工作单元和用例的人。如果你将多个DAO注入到一个服务中,而这些DAO需要在单个事务中一起工作,那么这是正确的答案。

  • 问题内容: 我使用Eclipse(3.4),并且类编译时没有警告或错误。我的项目使用一个外部jar文件。 为了从另一个项目(不在Eclipse中)使用此类时,我需要在哪里放置此外部jar文件? 我可以将jar提取到项目文件夹中,但是感觉不对。 编辑:这个问题不是关于在Eclipse中导入jar,而是在Eclipse之外使用它们。 问题答案: 如果要在Eclipse项目中包含JAR文件,通常可以在项