相关疑难解决方法(0)

REST API - DTO或不是?

我目前正在为一个项目创建一个REST-API,并且正在阅读关于最佳实践的文章.许多人似乎反对DTO,只是暴露域模型,而其他人似乎认为DTO(或用户模型或任何你想称之为的)是不好的做法.就个人而言,我认为这篇文章很有意义.

但是,我也理解DTO的缺点,包括所有额外的映射代码,可能与其DTO对应物100%相同的域模型等等.

我们的API主要是为了让其他客户端可以使用数据而创建的,但是如果我们做得对,我们也希望尽可能将它用于我们自己的Web GUI.

问题是我们可能不希望将所有域数据公开给其他客户端用户.大部分数据只在我们自己的Web应用程序中才有意义.此外,我们可能不希望在所有方案中公开有关对象的所有数据,尤其是与其他对象的关系等.例如,如果我们公开特定对象的列表,我们不一定要暴露整个对象层次结构; 这样对象的孩子就不会暴露,但可以通过链接(hateoas)发现.

我该如何解决这个问题?我正在考虑在我们的域模型上使用Jackson mixins来控制在给定不同场景的情况下会暴露哪些数据.或者我们应该一直使用DTO - 即使考虑到它的缺点和争议?

java rest spring dto hateoas

133
推荐指数
4
解决办法
6万
查看次数

将DTO转换为实体,反之亦然

我在我的Web应用程序中使用Spring MVC架构JPA.

哪里可以手动将DTO转换为实体,反之亦然(不使用任何框架)?

java jpa spring-mvc

16
推荐指数
5
解决办法
3万
查看次数

我应该将实体转换为Repository对象内的DTO并将其返回到服务层吗?

我想在这里找到两个非常相似的问题的答案:

我应该将实体转换为Repository对象内的DTO并将其返回到服务层吗?

要么

可以从存储库层返回DTO对象吗?

现在我被困在我的Servlet(Servie层)中,例如尝试从以下位置检索所有Restaurant对象RestaurantOwnerRepository:

// RestaurantOwnerService (Servlet)

@Override
@Transactional
public List<RestaurantDTO> getAvailableRestaurants() {

    List<Restaurant> availableRestaurants = restaurantOwnerRepository.getRestaurants(getSessionId());

    return null;
}
Run Code Online (Sandbox Code Playgroud)

这里Restaurant是一个@Entity注释的类 - 这似乎是我不应该做的第一件事,因为服务层现在知道一个非常低级别的对象,它违反了在每个层中抽象数据的尝试.

如果我将每个转换Restaurant为a,那就不会是这种情况RestaurantDTO - 但是我应该这样做,这样了吗?

基本上改变:

// RestaurantOwnerRepository

@Override
public List<Restaurant> getRestaurants(String sessionId) {

    RestaurantOwner restaurantOwner = this.get(sessionId);

    // .. getting restaurants ..

    return availableRestaurants;
}
Run Code Online (Sandbox Code Playgroud)

// RestaurantOwnerRepository

@Override
public List<Restaurant> getRestaurants(String sessionId) {

    RestaurantOwner restaurantOwner = this.get(sessionId);

    // .. getting restaurants ..

    return ConvertEntity.convertRestaurants(availableRestaurants);
} …
Run Code Online (Sandbox Code Playgroud)

java gwt web-services abstraction-layer

7
推荐指数
1
解决办法
1万
查看次数

Spring Boot-使用Lombok时Rest Controller返回空对象

我正在使用Spring Boot 2.1.4和Java开发一个简单的Rest API Gradle 5.0。我Lombok v1.18.6用来构建类,但是当我调用服务时,我收到一个空对象

我尝试手动添加getters和setters方法,它解决了该问题,但是我想知道为什么lombok在我的项目中不起作用。

另外,我的IDE可以正确识别lombok插入。我正在使用IntelliJ IDEA

我的gradle依赖项

    compileOnly 'org.projectlombok:lombok:1.18.6'
    annotationProcessor 'org.projectlombok:lombok:1.18.6'
Run Code Online (Sandbox Code Playgroud)

我的模特班:

@Entity
@Data
public class Category implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id_category")
    private int idCategory;

    @NotBlank
    private String name;

    @OneToMany(mappedBy = "category", cascade = CascadeType.ALL, orphanRemoval = true)
    @JsonProperty(access = JsonProperty.Access.READ_ONLY)
    private List<Language> languages;
}
Run Code Online (Sandbox Code Playgroud)

我的RestController:

@RestController
@RequestMapping("/categories")
public class CategoryController {

    @Autowired
    private CategoryService categoryService;

    @GetMapping
    public ResponseEntity<List<Category>> findAllCategories(){
        List<Category> categories = categoryService.findAll();
        return new …
Run Code Online (Sandbox Code Playgroud)

java rest json lombok spring-boot

5
推荐指数
1
解决办法
599
查看次数