小编dav*_*ooh的帖子

Spring MVC Controller中的硬编码@RequestMapping URL

我正在学习Spring 3,我在一个简单的Web应用程序中使用它.

现在我正在使用注释实现Spring MVC Controller,我想知道:有没有使用@RequestMapping注释的最佳实践?

我的意思是:我已经看到通常在这个注释中映射的URL在类中是硬编码的...
有没有办法以"松散耦合的方式"传递URL(以获得更可重用的类)?

我知道有一些可以使用的外卡,但我认为这不是解决方案......我错了吗?

编辑:

我举一个例子来更好地解释我的怀疑.

假设我希望我的控制器由请求触发/foo/bar/baz/mypage.htm,在我的控制器中,处理程序方法将被注释@RequestMapping("/foo/bar/baz/mypage").

现在我决定更改触发我的控制器的URL /foo/bar/otherpage.htm,所以我需要编辑我的类,添加@RequestMapping("/foo/bar/otherpage")我的处理程序方法,重新编译项目并再次部署它.

在我看来不太实际......

java model-view-controller spring annotations spring-mvc

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

Guava TypeToken和泛型类

我在我的项目中使用了Guava TypeToken类,但是我得到了意想不到的结果.

我有MyGenericClass<T>:

public class MyGenericClass<T> implements MyInterface {

    private TypeToken<T> recordType;

    public MyGenericClass(String name) {
        this.recordType = new TypeToken<T>(getClass()) {};

        // ...
    }

    // ...

    @SuppressWarnings("unchecked")
    protected Class<T> getRecordType() {
        return (Class<T>) recordType.getRawType();
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,如果我实例化一个对象new MyGenericClass<String>(),然后调用getRecordType()我希望得到java.lang.String,而不是我得到java.lang.Object.

但是,如果我扩展泛型类:

public class MyStringImpl extends  MyGenericClass<String> {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

并实例化这个新类:new MyStringImpl()然后我得到正确的结果.

为什么会这样?这是预期的行为TypeToken吗?

java generics guava

6
推荐指数
2
解决办法
4307
查看次数

Tomcat Embedded启动时出错

我正在开发一个Spring Boot(v1.3.3.RELEASE)项目.包含的Tomcat Embedded版本是8.0.32.

我收到这个错误:

2016-08-01 14:51:23.354 ERROR 6704 --- [ost-startStop-1] o.a.catalina.session.StandardManager     : Exception loading sessions from persistent storage

java.io.EOFException: null
    at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2335)
    ...
Run Code Online (Sandbox Code Playgroud)

我在这个问题上读到了同样的错误:从持久存储加载会话异常,但我无法找到解决问题的方法.

我尝试应用aswers中建议的解决方案,但在我的情况下,我找不到"清理Tomcat工作目录"的方法或只是为了清理我的应用程序部署.

我怎么解决这个问题?在哪里可以找到Tomcat Embedded版本的工作文件夹?

注意我使用Eclipse作为IDE

java spring tomcat spring-boot

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

避免 Spring MVC 控制器中的 NumberFormatException

在我的 Spring MVC 控制器中,我有一个这样的方法:

public String myMethod(@RequestParam(defaultValue="0") int param) { ... }
Run Code Online (Sandbox Code Playgroud)

当我传递一个字符串作为我的值时,我param显然得到了一个NumberFormatException

无法将“java.lang.String”类型的值转换为所需的“int”类型;嵌套异常是 java.lang.NumberFormatException: For input string: "test"

这很清楚...

所以我试图找到一种方法,在发生此错误时将用户重定向到默认页面。有没有通用的方法来实现这一目标?

目前我正在考虑使用 aString代替 anint来映射 my param,检查这是否可以解析int,然后切换到适当的逻辑,但这似乎是一种解决方法,而不是解决方案......

有没有更优雅的方法来处理这个问题并为 my 保持正确的类型绑定param

java spring spring-mvc

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

链接可选orElseThrow

我有一段这样的代码:

return getObject()
    .map(obj -> obj.getNullableField())
    .orElseThrow(() -> new IllegalStateException("Object not found!"));
Run Code Online (Sandbox Code Playgroud)

目前,当给定Object的不存在时,我会抛出异常.

现在我还需要检查nullableFieldObject存在.

一个明显的解决方案可能是这样的:

var fieldVal = getObject()
    .map(obj -> obj.getNullableField())
    .orElseThrow(() -> new IllegalStateException("Object not found!"));

  return Optional.ofNullable(fieldVal)
     .orElseThrow(() -> new IllegalStateException("Field is not present"));
Run Code Online (Sandbox Code Playgroud)

但是我想在同一个功能链中实现它......

我错过了什么?

java functional-programming optional

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

Spring验证 - 以编程方式绑定到Validator

我正在尝试使用Spring验证来验证由Jackson转换器填充的模型.所以我有一个java类,

class MyClass(){
    private String myString;
}
Run Code Online (Sandbox Code Playgroud)

这个类由Jackson填充,我在我的Java代码中有实例.还定义了一个验证器类,

class MyValidator implements Validator {
    public boolean supports(Class<?> clazz) {
        return MyClass.class.equals(clazz);
    }   
    public void validate(Object object, Errors errors) {
           //Validation logic here
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我想做的是将对象发送到验证器并获取错误对象,检查并继续进行.但是,为了打电话

validate(Object object,Errors errors) 
Run Code Online (Sandbox Code Playgroud)

我需要一个我没有的错误实例.我不能用BindingResultErrors.请告知如何继续进行.

java validation spring-mvc jackson

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

将小数小时添加到时间跨度

我有一个Decimal值表示一个时间间隔内的小时数.

现在我需要将此值加总为a TimeSpan,但我找不到有效的方法来执行此操作.

我现在的解决方案是做这样的事情:

myTimeSpan + new TimeSpan(0, 0, Math.Abs(decimalHours * 3600))
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来解决我的问题?

.net c# timespan .net-3.5

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

使用"大量"LINQ to Objects语句有什么缺点吗?

我来自Java编程并切换到C#编程我发现了LINQ的极端强大功能.

在我最近的实现中,我注意到我经常在我的代码中使用它(特别是LINQ to Objects)来避免foreach循环,搜索列表中的元素以及类似的任务.

现在我想知道在大量使用Linq to Objects时是否存在一些性能劣势......

.net c# linq performance

5
推荐指数
2
解决办法
5181
查看次数

使用Spring JDBC模板的连接异常

我有一个使用Spring开发的简单Web应用程序,最近我在数据库连接方面遇到了一些问题。我的数据库在MS SQL Server 2005上。

为了检索数据,我使用框架提供的JDBCTemplate类实现了几个DAO。

有时我会遇到以下异常:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.dao.DataAccessResourceFailureException: StatementCallback; SQL [SELECT [Campaigns].[CampaignID],[CampaignCode],[CampaignType],[StartDate],[EndDate],[Status],[FirstUpdate],[LastUpdate],[FirstUpdateUserID],[LastUpdateUserID],[CampaignDescriptions].[Description] FROM [Campaigns] INNER JOIN [CampaignDescriptions] ON [Campaigns].[CampaignID] = [CampaignDescriptions].[CampaignID] ORDER BY [StartDate] DESC]; Connection reset by peer: socket write error; nested exception is com.microsoft.sqlserver.jdbc.SQLServerException: Connection reset by peer: socket write error
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:894)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
Run Code Online (Sandbox Code Playgroud)

该异常似乎仅在执行报告的查询时才会发生。

我不明白是什么导致了这个问题。任何的想法?

执行查询的方法是:

@Transactional(propagation = Propagation.NEVER)
public Campaign[] getAll() {
    List<Campaign> campList = getJdbcTemplate()
            .query(BASE_QUERY,
                    new CampaignMapper());
    return campList.toArray(new Campaign[0]);
}
Run Code Online (Sandbox Code Playgroud)

其中BASE_QUERY是在异常消息是相同的。

java spring jdbc spring-mvc jdbctemplate

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

如何扩展默认的 Spring Boot CacheManager 配置

我在我的 Web 应用程序中使用 Spring Boot 缓存支持,并将Caffeine设置为缓存提供程序。

我的项目中有几个缓存,大多数都有通用的配置,但是对于两个特定的缓存我需要设置不同的参数。

在我的application.properties我有类似的东西:

spring.cache.cache-names=a-cache,b-cache,c-cache, ...
spring.cache.caffeine.spec=maximumSize=200,expireAfterWrite=3600s
Run Code Online (Sandbox Code Playgroud)

这适用于常见的缓存。然后我想用自定义参数扩展这个配置。

这篇文章解释了如何通过@Configuration类配置缓存,但使用这种方法我完全覆盖了通用配置。

我需要的是这样的:

@Configuration
public class CacheConfiguration {

    @Autowired
    private CacheManager cacheManager;

    @Bean
    public CacheManager cacheManager(Ticker ticker) {
        CaffeineCache c1 = new CaffeineCache("my-custom-cache", Caffeine.newBuilder()
                       .expireAfterWrite(10, TimeUnit.MINUTES)
                       .maximumSize(400)
                       .build());

        // ...

        cacheManager.setCaches(Arrays.asList(..., c1, ... )); // here I'd like to add custom caches...
        return cacheManager;
    }

}
Run Code Online (Sandbox Code Playgroud)

但是声明一个新的CacheManagerbean,“原始”cacheManager不是自动装配的......

有没有办法实现我需要的?

java spring spring-boot caffeine

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