小编jDu*_*ub9的帖子

使用Java 8按字段排序作为输入

我有一个REST端点和我想的UI来传递他们希望通过自己的排序结果中的字段名称"id","name"等我想出了下面,但真的想使用反射/泛型所以这可能是扩大到包括每我的项目中的对象.

如果我想为100个不同的类提供相同的功能,我觉得这个解决方案不易维护.

public static void sort(List<MovieDTO> collection, String field) {
    if(collection == null || collection.size() < 1 || field == null || field.isEmpty()) {
        return;
    }

    switch(field.trim().toLowerCase()) {
        case "id": 
            collection.sort(Comparator.comparing(MovieDTO::getId));
            break;
        case "name": 
            collection.sort(Comparator.comparing(MovieDTO::getName));
            break;
        case "year": 
            collection.sort(Comparator.comparing(MovieDTO::getYear));
            break;
        case "rating": 
            collection.sort(Comparator.comparing(MovieDTO::getRating));
            break;
        default: 
            collection.sort(Comparator.comparing(MovieDTO::getId));
            break;
    }
}
Run Code Online (Sandbox Code Playgroud)

关于如何更好地实现这一点的任何想法,以便它可以扩展到几乎没有维护的企业应用程序?

java sorting reflection comparator java-8

8
推荐指数
1
解决办法
1283
查看次数

尝试在Java 8中对数据中的Null进行排序

我试图按照比较器给出的列表进行排序.我通过NullsLast方法传递比较器,以获得比较像JavaDoc状态的Null-Friendly版本的比较器.但是,当我运行代码时,当我将String比较器传递给方法时,我仍然会得到一个Null Pointer Exception.

private <T> void sortWithDirection(List<T> details, boolean isAscending, Comparator<T> comparator){

    if(isAscending){
        details.sort(Comparator.nullsLast(comparator));
    } else {
        details.sort(Comparator.nullsLast(comparator.reversed()));
    }
}

List<UserDTO> users = new ArrayList<>();
sortWithDirection(users, false, Comparator.comparing(UserDTO::getName));
Run Code Online (Sandbox Code Playgroud)

我使用这种方法错了吗?是否有不同的方法可以阻止NPE而不将其从结果集中删除?

java sorting java-8

3
推荐指数
1
解决办法
1363
查看次数

收集实例不按预期行事

我正在通过实现Validator接口实现一些Spring Framework验证.我想支持我的DTO对象,Long(用于主键验证)和Collection,这样我就不需要在我的控制器方法中多次调用Invoke Validation

/*
 * (non-Javadoc)
 * @see org.springframework.validation.Validator#supports(java.lang.Class)
 */
@Override
public boolean supports(Class<?> clazz) {

    Class<?>[] supportedClasses = {

            UserDTO.class,
            Collection.class,
            Long.class
    };
    for(Class<?> c : supportedClasses){
        if(clazz.equals(c)){
            return true;
        }
    }
    return false;
}
/*
 * (non-Javadoc)
 * @see org.springframework.validation.Validator#validate(java.lang.Object, org.springframework.validation.Errors)
 */
@Override
public void validate(Object target, Errors errors) {

    if(target instanceof Collection<?>){
        Iterator<?> i = ((Collection<?>) target).iterator();

        while(i.hasNext()){
            validate(i.next(), errors);
        }

        return;
    }
Run Code Online (Sandbox Code Playgroud)

在我的控制器中,当我调用Validation时,我正在传递一个ArrayList,但是接收到IllegalArgumentException(Validator类不支持ArrayList).这应该正常吗?因为ArrayList是一个Collection因此(ArrayList instanceof Collection)应该返回true.

如果这个逻辑不正确,请告诉我.这真的让我很紧张.另外,请不要在模型中提及简单的javax验证,例如

// ---- Bean Class

@NotNull
private …
Run Code Online (Sandbox Code Playgroud)

java collections validation spring

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

搜索嵌套对象的规范/谓词

我正在使用带有Spring JPA和Specification Executor的Spring Boot.我有我的Specification/Predicate组合成功搜索我班级中的简单属性.但是,我在搜索其中的对象时遇到困难.他们需要单独的规格吗?我有一个类,其中包含2个多对一映射类,并希望从同一个类中搜索这些字段.

谓词实施

public Specification<User> getSpecification(SpecificationField field, Object searchCriteria){
    return new Specification<User>() {
    @Override
    public Predicate toPredicate(Root<User> root, CriteriaQuery<?> query, CriteriaBuilder cb) {

    if(searchCriteria instanceof String){
        searchCriteria.toString().trim().toLowerCase();
    }

    switch(field){
    case USER_GROUP:    
        return cb.equal(cb.lower(root.<String> get("group").get("name")), searchCriteria);
    case USER_ROLE: 
        return cb.equal(cb.lower(root.<String> get("role").get("name")), searchCriteria);
    case USER_EMAIL: 
        return cb.equal(cb.lower(root.<String> get("email")), searchCriteria);
    case USER_FIRSTNAME: 
        return cb.equal(cb.lower(root.<String> get("firstName")), searchCriteria);
    case USER_LASTNAME: 
        return cb.equal(cb.lower(root.<String> get("lastName")), searchCriteria);
    case USER_USERNAME: 
        return cb.equal(cb.lower(root.<String> get("username")), searchCriteria);
    default:
        assert true;
        return null;
    }
Run Code Online (Sandbox Code Playgroud)

用户类

@Id
@GeneratedValue
@Column(name = "USER_ID")
private …
Run Code Online (Sandbox Code Playgroud)

java specifications jpa predicate spring-data

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

如何在Java的LocalDateTime和LocalDate上配置Jackson序列化?

我知道在Stackoverflow上有很多与此主题相关的文章,我敢肯定我已经阅读了所有这些文章,但是我仍在努力使这项工作正常进行,并且希望获得任何指导。

这是我正在使用的Spring Parent和Jackson依赖关系:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.9.RELEASE</version>
</parent>

<!-- Jackson -->
<dependency>
    <groupId>com.fasterxml.jackson.module</groupId>
    <artifactId>jackson-module-parameter-names</artifactId>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jdk8</artifactId>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
Run Code Online (Sandbox Code Playgroud)

在我的应用程序配置中,我尝试使用:

@Autowired
void configureJackson(ObjectMapper jackson2ObjectMapper) {

    JavaTimeModule timeModule = new JavaTimeModule();

    timeModule.addDeserializer(LocalDate.class,
            new LocalDateDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));

    timeModule.addDeserializer(LocalDateTime.class,
            new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));

    timeModule.addSerializer(LocalDate.class,
            new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));

    timeModule.addSerializer(LocalDateTime.class,
            new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));

    jackson2ObjectMapper
            .configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false)
            .setSerializationInclusion(JsonInclude.Include.NON_NULL)
            .registerModule(timeModule)
            .registerModule(new ParameterNamesModule())
            .registerModule(new Jdk8Module())
            .registerModule(new JtsModule());
}
Run Code Online (Sandbox Code Playgroud)

这是我正在测试的模型。(我试图在5-6个型号中达到相同的效果)。

public class DateRange implements Serializable {

     private static final long serialVersionUID = 6412487507434252330L;

     private LocalDateTime startTime;
     private LocalDateTime endTime; …
Run Code Online (Sandbox Code Playgroud)

java serialization jackson

0
推荐指数
1
解决办法
4502
查看次数