2016年工作中遇到的问题31-40
生活随笔
收集整理的這篇文章主要介紹了
2016年工作中遇到的问题31-40
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
31.Spring和Dubbo中都有@Service注解,需要注意。
import com.alibaba.dubbo.config.annotation.Service;
import org.springframework.stereotype.Service;
32. Eclipse地方的注釋換行了。
/**
* 校驗(yàn)令牌信息是否有效
*
* @param token
* ? ? ? ? ? ?令牌信息
* @return 是否有效
*/
public boolean checkToken(String token) throws MemberSecurityException;
項(xiàng)目中需要改為:
/**
* 校驗(yàn)令牌信息是否有效
*
* @param token 令牌信息
* @return 是否有效
*/
public boolean checkToken(String token) throws MemberSecurityException;
修改模版,
Preference-Java-Code Style-Formatter-Edit-Comments-"New line after @Param tag"。
把自己的Formatter.xml文件導(dǎo)出,再導(dǎo)入,Ctrl+Shift+F,格式化就可以了。
33.SpringMVC,Fastjson,$ref.
最后的json存在$ref,前端js不好處理。(前端應(yīng)該存在對應(yīng)的js組件,可以解析這種$ref引用)
public static void main(String[] args) {
Member member = new Member();
member.setId(1L);
List<Member> memberList = new ArrayList<Member>();
memberList.add(member);
memberList.add(member);
System.out.println(JSON.toJSONString(memberList));
}
[{"id":1},{"$ref":"$[0]"}]
解決辦法1:
public static void main(String[] args) {
Member member = new Member();
member.setId(1L);
List<Member> memberList = new ArrayList<Member>();
memberList.add(member);
memberList.add(member);
System.out.println(JSON.toJSONString(memberList,SerializerFeature.DisableCircularReferenceDetect));
}
輸出:[{"id":1},{"id":1}]
解決辦法2:
<bean id="jsonConverter"
? ? class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
? ? <property name="supportedMediaTypes" value="application/json;charset=UTF-8"/>
? ? <property name="features">
? ? ? <array value-type="com.alibaba.fastjson.serializer.SerializerFeature">
? ? ? ? <value>DisableCircularReferenceDetect</value>
? ? ? </array>
? ? </property>
? </bean>
? <bean id="DisableCircularReferenceDetect" class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean">
? ? <property name="staticField" value="com.alibaba.fastjson.serializer.SerializerFeature.DisableCircularReferenceDetect"></property>
? </bean>
??
34.拋出異常,打印對應(yīng)的“中文提示”。
super(codeEnum.getRemark());//這句話很關(guān)鍵,有了它,拋出異常的時(shí)候,可以直接看到“錯(cuò)誤提示”
public enum MemberSecurityCodeEnum {
INVALID_ACCESS_TOKEN(13000,"不合法的AccessToken"),
ACCESS_TOKEN_EXPIRED(13001,"AccessToken已過期"),
}
public class MemberSecurityException extends Exception {
private Integer code;
private String msg;
public MemberSecurityException() {
super();
}
public MemberSecurityException(MemberSecurityCodeEnum codeEnum) {
super(codeEnum.getRemark());//這句話很關(guān)鍵,有了它,拋出異常的時(shí)候,可以直接看到“錯(cuò)誤提示”
this.code = codeEnum.getCode();
this.msg = codeEnum.getRemark();
}
}
Exception in thread "main" exception.MemberSecurityException
#這種提示更直觀
Exception in thread "main" exception.MemberSecurityException: AccessToken已過期
public static void main(String[] args) throws MemberSecurityException {
throw new MemberSecurityException(MemberSecurityCodeEnum.ACCESS_TOKEN_EXPIRED);
}
35.修改表字段的sql語句。
alter table order_item
change column productJson specJson text;
36.SpringMVC屬性讀取和容器,父子關(guān)系。
?友情提示:父子關(guān)系理論應(yīng)該是正確的,但不同配置文件之間的“父子關(guān)系”有待考驗(yàn)。
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:spring-context.xml
</param-value>
</context-param>
這個(gè)是“頂級(jí)容器”,spring-mvc-servlet.xml是子容器。
猜測:web.xml先讀取的是context上下文文件,另外MVC映射也是“可選的”。重要性方面,context更重要!
另外一種場景,
spring-context.xml
<import resource="classpath:spring-bean-service.xml" />
<import resource="classpath:spring-task.xml" />
疑問:spring-task.xml和spring-bean-service.xml之間的關(guān)系是?
? ? 猜測:平級(jí),應(yīng)該可以讀取的到。他們都被導(dǎo)入到spring-context.xml中了。
掃描配置文件
? ? <util:properties id="domainConfig" location="classpath:goods-domain.properties" />
<context:property-placeholder properties-ref="domainConfig" ignore-unresolvable="true" />
domainName=http://a.com
${domainName},如果注入到Java類中的變量值仍然是"${domainName}",而非“http://a.com”,就說明失敗了。
37.Cookie寫入失敗?Cookie只能用80端口嗎?
? ?Java程序?qū)懭隒ookie,瀏覽器再請求時(shí),一只沒有把Cookie帶過來。
? ?代碼是從之前的項(xiàng)目中copy過來的,質(zhì)量是很有保障的。
? ?
? ?最終比較懷疑是,Cookie只能使用80端口,后來用了80端口,也還是不行。
? ?
? ?然后又懷疑是,SpringMVC的ResponseBody有影響。
? ?之前的代碼是,手動(dòng)調(diào)用Response.write發(fā)送字符串響應(yīng)Web前端,然后跳轉(zhuǎn)的。
? ?//@ResponseBody
@RequestMapping(value = "/doLogin")
public void doLogin(String loginName, String password,
? ?
? ?嘗試了很多種方案,最后才開始考慮是配置問題,因?yàn)榇a都是一樣的。
? ?正解:
? ?p2p.domain=.p2p.jtn.com
#p2p.static=http://p2p.jtn.com:80/static
loginDomain=http://login.p2p.jtn.com:80
frontDomain=http://p2p.jtn.com:80
錯(cuò)解:
frontDomain=http://dev.jtn.com:8080
直接使用帶了“http://"前綴的frontDomain
解決辦法:
cookieDomain=.dev.jtn.com?
frontDomain=http://dev.jtn.com:8080
cookieDomain用這個(gè)名字,看著更加直觀,不會(huì)再錯(cuò)啦!!!(*^__^*)?
經(jīng)驗(yàn):論變量名稱的重要性!!!
38.注冊的時(shí)候,一個(gè)人注冊了多次。
5118971326303d4f2bf07dc1be38b20cd6e46949a1071f9d0e3d002016-06-15 17:14:532016-06-15 17:14:530
5218971326303d4f2bf07dc1be38b20cd6e46949a1071f9d0e3d002016-06-15 17:14:542016-06-15 17:14:540
數(shù)據(jù)庫的手機(jī)號(hào),沒有加“唯一約束”。
使用zookeeper鎖顯然是不合適的,2個(gè)不同人,是可以同時(shí)注冊的。
最簡單的辦法,只能是數(shù)據(jù)庫添加“唯一約束”了。
39.Dubbo有警告warn。
please config: dubbo.registry.file=xxx.properties。
java.io.IOException: Can not lock the registry cache file C:\Users\Administrator\.dubbo\dubbo-registry-224.5.6.110.cache, ignore and retry later, maybe multi java process use the file, please config: dubbo.registry.file=xxx.properties
at com.alibaba.dubbo.registry.support.AbstractRegistry.doSaveProperties(AbstractRegistry.java:193)
at com.alibaba.dubbo.registry.support.AbstractRegistry$SaveProperties.run(AbstractRegistry.java:150)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:722)
按照提示,配置了dubbo.registry.file=xxx.properties,還是不行。
可能的解決辦法:zookepper緩存,清除或者重啟就好。
40.JS換行符和在JS中整段地寫HTML。
?在2013年或者2014年,之前的問題總結(jié)中,遇到過這個(gè)問題。
?當(dāng)時(shí),沒有搞成功。
?今天,又遇到了這個(gè)問題,成功了。
?
?之前的
?var str = '' +
'<!doctype html>' +
'<html>' +
' ? <body>' +
' ? ? ? <h1>? unicorns</h1>' +
' ? </body>' +
'</html>' +
'';
現(xiàn)在的
var str = '\
<!doctype html>\
<html>\
? ?<body>\
? ? ? ?<h1>? unicorns</h1> \
? ?</body> \
</html>';
注意:不能使用Windows的換行符,"\" 必須在最后;
使用網(wǎng)上的某些JS插件,還可以這么寫:
var str = multiline(function(){/*
<!doctype html>
<html>
? ? <body>
? ? ? ? <h1>? unicorns</h1>
? ? </body>
</html>
*/});
原理:
? 1. 在一個(gè)function中寫上一段多行注釋
? 2. 將此function toString()
? 3. 將多行注釋內(nèi)容用正則匹配出來
參考資料:http://ourjs.com/detail/53c8826a7a0187d41d000003
http://www.jb51.net/article/49480.htm
import com.alibaba.dubbo.config.annotation.Service;
import org.springframework.stereotype.Service;
32. Eclipse地方的注釋換行了。
/**
* 校驗(yàn)令牌信息是否有效
*
* @param token
* ? ? ? ? ? ?令牌信息
* @return 是否有效
*/
public boolean checkToken(String token) throws MemberSecurityException;
項(xiàng)目中需要改為:
/**
* 校驗(yàn)令牌信息是否有效
*
* @param token 令牌信息
* @return 是否有效
*/
public boolean checkToken(String token) throws MemberSecurityException;
修改模版,
Preference-Java-Code Style-Formatter-Edit-Comments-"New line after @Param tag"。
把自己的Formatter.xml文件導(dǎo)出,再導(dǎo)入,Ctrl+Shift+F,格式化就可以了。
33.SpringMVC,Fastjson,$ref.
最后的json存在$ref,前端js不好處理。(前端應(yīng)該存在對應(yīng)的js組件,可以解析這種$ref引用)
public static void main(String[] args) {
Member member = new Member();
member.setId(1L);
List<Member> memberList = new ArrayList<Member>();
memberList.add(member);
memberList.add(member);
System.out.println(JSON.toJSONString(memberList));
}
[{"id":1},{"$ref":"$[0]"}]
解決辦法1:
public static void main(String[] args) {
Member member = new Member();
member.setId(1L);
List<Member> memberList = new ArrayList<Member>();
memberList.add(member);
memberList.add(member);
System.out.println(JSON.toJSONString(memberList,SerializerFeature.DisableCircularReferenceDetect));
}
輸出:[{"id":1},{"id":1}]
解決辦法2:
<bean id="jsonConverter"
? ? class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
? ? <property name="supportedMediaTypes" value="application/json;charset=UTF-8"/>
? ? <property name="features">
? ? ? <array value-type="com.alibaba.fastjson.serializer.SerializerFeature">
? ? ? ? <value>DisableCircularReferenceDetect</value>
? ? ? </array>
? ? </property>
? </bean>
? <bean id="DisableCircularReferenceDetect" class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean">
? ? <property name="staticField" value="com.alibaba.fastjson.serializer.SerializerFeature.DisableCircularReferenceDetect"></property>
? </bean>
??
34.拋出異常,打印對應(yīng)的“中文提示”。
super(codeEnum.getRemark());//這句話很關(guān)鍵,有了它,拋出異常的時(shí)候,可以直接看到“錯(cuò)誤提示”
public enum MemberSecurityCodeEnum {
INVALID_ACCESS_TOKEN(13000,"不合法的AccessToken"),
ACCESS_TOKEN_EXPIRED(13001,"AccessToken已過期"),
}
public class MemberSecurityException extends Exception {
private Integer code;
private String msg;
public MemberSecurityException() {
super();
}
public MemberSecurityException(MemberSecurityCodeEnum codeEnum) {
super(codeEnum.getRemark());//這句話很關(guān)鍵,有了它,拋出異常的時(shí)候,可以直接看到“錯(cuò)誤提示”
this.code = codeEnum.getCode();
this.msg = codeEnum.getRemark();
}
}
Exception in thread "main" exception.MemberSecurityException
#這種提示更直觀
Exception in thread "main" exception.MemberSecurityException: AccessToken已過期
public static void main(String[] args) throws MemberSecurityException {
throw new MemberSecurityException(MemberSecurityCodeEnum.ACCESS_TOKEN_EXPIRED);
}
35.修改表字段的sql語句。
alter table order_item
change column productJson specJson text;
36.SpringMVC屬性讀取和容器,父子關(guān)系。
?友情提示:父子關(guān)系理論應(yīng)該是正確的,但不同配置文件之間的“父子關(guān)系”有待考驗(yàn)。
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:spring-context.xml
</param-value>
</context-param>
這個(gè)是“頂級(jí)容器”,spring-mvc-servlet.xml是子容器。
猜測:web.xml先讀取的是context上下文文件,另外MVC映射也是“可選的”。重要性方面,context更重要!
另外一種場景,
spring-context.xml
<import resource="classpath:spring-bean-service.xml" />
<import resource="classpath:spring-task.xml" />
疑問:spring-task.xml和spring-bean-service.xml之間的關(guān)系是?
? ? 猜測:平級(jí),應(yīng)該可以讀取的到。他們都被導(dǎo)入到spring-context.xml中了。
掃描配置文件
? ? <util:properties id="domainConfig" location="classpath:goods-domain.properties" />
<context:property-placeholder properties-ref="domainConfig" ignore-unresolvable="true" />
domainName=http://a.com
${domainName},如果注入到Java類中的變量值仍然是"${domainName}",而非“http://a.com”,就說明失敗了。
37.Cookie寫入失敗?Cookie只能用80端口嗎?
? ?Java程序?qū)懭隒ookie,瀏覽器再請求時(shí),一只沒有把Cookie帶過來。
? ?代碼是從之前的項(xiàng)目中copy過來的,質(zhì)量是很有保障的。
? ?
? ?最終比較懷疑是,Cookie只能使用80端口,后來用了80端口,也還是不行。
? ?
? ?然后又懷疑是,SpringMVC的ResponseBody有影響。
? ?之前的代碼是,手動(dòng)調(diào)用Response.write發(fā)送字符串響應(yīng)Web前端,然后跳轉(zhuǎn)的。
? ?//@ResponseBody
@RequestMapping(value = "/doLogin")
public void doLogin(String loginName, String password,
? ?
? ?嘗試了很多種方案,最后才開始考慮是配置問題,因?yàn)榇a都是一樣的。
? ?正解:
? ?p2p.domain=.p2p.jtn.com
#p2p.static=http://p2p.jtn.com:80/static
loginDomain=http://login.p2p.jtn.com:80
frontDomain=http://p2p.jtn.com:80
錯(cuò)解:
frontDomain=http://dev.jtn.com:8080
直接使用帶了“http://"前綴的frontDomain
解決辦法:
cookieDomain=.dev.jtn.com?
frontDomain=http://dev.jtn.com:8080
cookieDomain用這個(gè)名字,看著更加直觀,不會(huì)再錯(cuò)啦!!!(*^__^*)?
經(jīng)驗(yàn):論變量名稱的重要性!!!
38.注冊的時(shí)候,一個(gè)人注冊了多次。
5118971326303d4f2bf07dc1be38b20cd6e46949a1071f9d0e3d002016-06-15 17:14:532016-06-15 17:14:530
5218971326303d4f2bf07dc1be38b20cd6e46949a1071f9d0e3d002016-06-15 17:14:542016-06-15 17:14:540
數(shù)據(jù)庫的手機(jī)號(hào),沒有加“唯一約束”。
使用zookeeper鎖顯然是不合適的,2個(gè)不同人,是可以同時(shí)注冊的。
最簡單的辦法,只能是數(shù)據(jù)庫添加“唯一約束”了。
39.Dubbo有警告warn。
please config: dubbo.registry.file=xxx.properties。
java.io.IOException: Can not lock the registry cache file C:\Users\Administrator\.dubbo\dubbo-registry-224.5.6.110.cache, ignore and retry later, maybe multi java process use the file, please config: dubbo.registry.file=xxx.properties
at com.alibaba.dubbo.registry.support.AbstractRegistry.doSaveProperties(AbstractRegistry.java:193)
at com.alibaba.dubbo.registry.support.AbstractRegistry$SaveProperties.run(AbstractRegistry.java:150)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:722)
按照提示,配置了dubbo.registry.file=xxx.properties,還是不行。
可能的解決辦法:zookepper緩存,清除或者重啟就好。
40.JS換行符和在JS中整段地寫HTML。
?在2013年或者2014年,之前的問題總結(jié)中,遇到過這個(gè)問題。
?當(dāng)時(shí),沒有搞成功。
?今天,又遇到了這個(gè)問題,成功了。
?
?之前的
?var str = '' +
'<!doctype html>' +
'<html>' +
' ? <body>' +
' ? ? ? <h1>? unicorns</h1>' +
' ? </body>' +
'</html>' +
'';
現(xiàn)在的
var str = '\
<!doctype html>\
<html>\
? ?<body>\
? ? ? ?<h1>? unicorns</h1> \
? ?</body> \
</html>';
注意:不能使用Windows的換行符,"\" 必須在最后;
使用網(wǎng)上的某些JS插件,還可以這么寫:
var str = multiline(function(){/*
<!doctype html>
<html>
? ? <body>
? ? ? ? <h1>? unicorns</h1>
? ? </body>
</html>
*/});
原理:
? 1. 在一個(gè)function中寫上一段多行注釋
? 2. 將此function toString()
? 3. 將多行注釋內(nèi)容用正則匹配出來
參考資料:http://ourjs.com/detail/53c8826a7a0187d41d000003
http://www.jb51.net/article/49480.htm
轉(zhuǎn)載于:https://www.cnblogs.com/qitian1/p/6462381.html
總結(jié)
以上是生活随笔為你收集整理的2016年工作中遇到的问题31-40的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [原] XAF 添加日期筛选下拉选择
- 下一篇: iOS 去除导航栏下的黑线