我有一个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)
关于如何更好地实现这一点的任何想法,以便它可以扩展到几乎没有维护的企业应用程序?
我试图按照比较器给出的列表进行排序.我通过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而不将其从结果集中删除?
我正在通过实现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) 我正在使用带有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) 我知道在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 ×5
java-8 ×2
sorting ×2
collections ×1
comparator ×1
jackson ×1
jpa ×1
predicate ×1
reflection ×1
spring ×1
spring-data ×1
validation ×1